Diferencia entre []String y ...String en Go

Jay Singh 30 enero 2023
  1. Definir una rebanada usando []string en Go
  2. Definir una función variádica usando ...string en Go
  3. Use tanto []string como ...string en Go
Diferencia entre []String y ...String en Go

Una sección de array se denomina segmento. Los segmentos brindan más potencia, flexibilidad y conveniencia que los arreglos.

Las rebanadas son indexables y tienen una longitud similar a los arrays. A diferencia de los arrays, se pueden expandir.

Un segmento es una estructura de datos que define una sección contigua de una matriz y se mantiene separada de la variable de segmento.

No es lo mismo un array que un slice. Una porción de una matriz es un subconjunto de ella.

Este artículo discutirá las diferencias entre []string y ...string en Go.

Definir una rebanada usando []string en Go

En este ejemplo, usamos los comandos for y range para iterar a través de un conjunto de palabras.

package main

import "fmt"

func main() {
    words := []string{"Iron Man", "Thor", "Hulk", "Dr Strange", "Spiderman"}
    for idx, word := range words {
        fmt.Println(idx, word)
    }
}

Producción :

0 Iron Man
1 Thor
2 Hulk
3 Dr Strange
4 Spiderman

Definir una función variádica usando ...string en Go

Los puntos suspensivos (...) delante del parámetro definen una función variádica. Hagamos un programa que responda a los nombres de los Avengers que se proporcionan a una función.

Diseñamos un método sayHello que acepta un parámetro, names. Como agregamos puntos suspensivos (...) antes del tipo de datos: ...string, el argumento es una variable.

Go entiende que la función puede tomar cero, uno o muchos parámetros.

El parámetro names se envía al método sayHello como un segmento. Debido a que el tipo de datos es una cadena, el parámetro names se puede manejar dentro del cuerpo del método como una porción de cadenas ([]string).

Podemos usar el operador range para construir un bucle que itere a través de la porción de cadenas.

package main

import "fmt"

func main() {
    sayHello()
    sayHello("Iron Man")
    sayHello("Thor", "Hulk", "Dr Strange", "Spiderman")
}

func sayHello(names ...string) {
    for _, n := range names {
        fmt.Printf("Hello %s\n", n)
}

Producción :

Hello Iron Man
Hello Thor
Hello Hulk
Hello Dr Strange
Hello Spiderman

Use tanto []string como ...string en Go

package main

import "fmt"

func f(args ...string) {
    fmt.Println(len(args))
    for i, s := range args {
        fmt.Println(i, s)
    }
}

func main() {
    args := []string{"Hello", "Jay"}
    f(args...)
}

Producción :

2
0 Hello
1 Jay

Artículo relacionado - Go Slice

Artículo relacionado - Go Variadic