¿Cuál es la diferencia entre [] cadena y… cadena en golang?

85

En el idioma Go,

[]string es una matriz de cadenas

y también lo usamos ...stringcomo parámetro.

¿Cuál es la diferencia?

Definición de función:

func f(args ...string) {}

¿Puedo llamar a esta función como se muestra a continuación?

args := []string{"a", "b"}

f(args)
usuario1746360
fuente

Respuestas:

126

[]string es una matriz de cadenas

Técnicamente, es un segmento que hace referencia a una matriz subyacente.

y también lo usamos ...stringcomo parámetro.

¿Cuál es la diferencia?

Con respecto a la estructura, nada en realidad. El tipo de datos resultante de ambas sintaxis es el mismo.

La ...sintaxis del parámetro lo convierte en un parámetro variable. Aceptará cero o más stringargumentos y hará referencia a ellos como un segmento.

Con respecto a la llamada f, puede pasar una porción de cadenas al parámetro variadic con la siguiente sintaxis:

func f(args ...string) {
    fmt.Println(len(args))
}


args := []string{"a", "b"}

f(args...)

Esta sintaxis está disponible para el segmento construido usando la sintaxis literal o el segmento que representa el parámetro variadic (ya que realmente no hay diferencia entre ellos) .

http://play.golang.org/p/QWmzgIWpF8

Odio la pereza
fuente
10
[]stringes una porción, no una matriz. Las diferencias entre una matriz y un corte son sutiles pero importantes.
Stephen Weinberg
@StephenWeinberg: Sí, mi respuesta de "nada en realidad" a la cita de "cuál es la diferencia" es responder a la pregunta que se hizo sobre la diferencia entre el segmento generado por el parámetro de función variadic y el creado usando la []stringsintaxis. Agregaré más de la cita a mi respuesta para que sea más clara. :-)
Odio la pereza
@IHateLazy ¿Hay alguna manera de hacer que el builtin printlnfuncione con puntos suspensivos? aquí puedes encontrar mis experimentos. Si alguien desea algunas funciones de depuración de impresión, vaya a ver mi juego.
bóveda
14

Ambos crean una matriz de cadenas, pero la diferencia está en cómo se llama.

func f(args ...string) {

}
// Would be called like this:

f("foo","bar","baz");

Esto le permite aceptar un número variable de argumentos (todos del mismo tipo)

Un gran ejemplo de esto es fmt.Printy amigos, que pueden aceptar tantos argumentos como desee.

Tylerl
fuente
No soy un experto en Go, pero ¿no es un argumento variable y el otro un argumento de matriz única, y no son los dos distintos como en otros idiomas?
Lightness Races in Orbit
1
@LightnessRacesinOrbit Sí. Si eso no está claro, lamento la confusión. La primera línea sobre la creación de una matriz solo significa que el argumento resultante en ambas instancias es una matriz. Es casi idéntico a la def fn(*args)construcción de Python .
tylerl
Entonces, ¿Go expone argumentos variadic como una instancia de un tipo de matriz? Eso es grato.
Lightness Races in Orbit
En realidad, ambos crean una porción de cuerdas, no una matriz. Son cosas diferentes en golang.
PointerToConstantChar
Ambos no crean una "matriz" de cadenas, crean una "porción" de cadenas.
Inanc Gumus
5

Esto es lo que quieres:

var args []string = []string{"A", "B", "C"}

func Sample(args ...string) {
    for _, arg := range args {
        fmt.Println(arg)
    }
}

func main() {
    Sample(args...)
}

Jugar: http://play.golang.org/p/N1ciDUKfG1

Ertuğrul
fuente
1

Simplifica los parámetros de su función. Aquí está un ejemplo ( https://play.golang.org/p/euMuy6IvaM ): Método SampleEllipsis acepta de cero a muchos parámetros del mismo tipo, pero en el método SampleArray es obligatorio args a ser declaradas.

package main

import "fmt"

func SampleEllipsis(args ...string) {
    fmt.Printf("Sample ellipsis : %+v\n",args)
}


func SampleArray(args []string) {
    fmt.Println("Sample array ")
    SampleEllipsis(args...)
}

func main() {
    // Method one
    SampleEllipsis([]string{"A", "B", "C"}...)
    // Method two
    SampleEllipsis("A", "B", "C")
    // Method three
    SampleEllipsis()

    // Simple array
    SampleArray([]string{"A", "B", "C"})

    // Simple array
    SampleArray([]string{})

}

Devoluciones :

Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array 
Sample ellipsis : [A B C]
Sample array 
Sample ellipsis : []
Petre Sosa
fuente