Qual'è la differenza tra [] string e ... string in golang?


85

Nella lingua Go,

[]string è un array di stringhe

e usiamo anche ...stringcome parametro.

Qual è la differenza?

Definizione della funzione:

func f(args ...string) {}

Posso chiamare questa funzione come di seguito?

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

f(args)

Risposte:


126

[]string è un array di stringhe

Tecnicamente è una fetta che fa riferimento a un array sottostante

e usiamo anche ...stringcome parametro.

Qual è la differenza?

Per quanto riguarda la struttura, niente di veramente. Il tipo di dati risultante da entrambe le sintassi è lo stesso.

La ...sintassi del parametro crea un parametro variadico. Accetterà zero o più stringargomenti e li farà riferimento come una sezione.

Per quanto riguarda la chiamata f, puoi passare una sezione di stringhe nel parametro variadic con la seguente sintassi:

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


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

f(args...)

Questa sintassi è disponibile sia per la sezione costruita utilizzando la sintassi letterale, sia per la sezione che rappresenta il parametro variadico (poiché non c'è davvero alcuna differenza tra loro) .

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


10
[]stringè uno slice, non un array. Le differenze tra un array e uno slice sono sottili ma importanti.
Stephen Weinberg

@StephenWeinberg: Sì, la mia risposta "niente di veramente" alla citazione "qual è la differenza" sta rispondendo alla domanda che è stata posta sulla differenza tra la fetta generata dal parametro della funzione variadica e quella creata usando la []stringsintassi. Aggiungerò più citazione alla mia risposta per renderla più chiara. :-)
I Hate Lazy

@IHateLazy Esiste un modo per far printlnfunzionare builtin con i puntini di sospensione? Qui puoi trovare i miei esperimenti. Se qualcuno desidera alcune funzioni di stampa di debug, guarda il mio playgound.
caveau

14

Entrambi creano un array di stringhe, ma la differenza sta nel modo in cui viene chiamato.

func f(args ...string) {

}
// Would be called like this:

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

Ciò ti consente di accettare un numero variabile di argomenti (tutti dello stesso tipo)

Un ottimo esempio di questo è fmt.Printe gli amici, che possono accettare il numero di arugment che desideri.


Non sono un esperto di Go, ma un argomento variadico e l'altro non sono un singolo argomento di matrice, e non sono i due distinti come in altre lingue?
Gare di leggerezza in orbita

1
@LightnessRacesinOrbit Yup. Se non è chiaro, scusa per la confusione. La prima riga sulla creazione di un array significa semplicemente che l'argomento risultante in entrambe le istanze è un array. È quasi identico alla def fn(*args)costruzione di Python .
tylerl

Quindi Go espone argomenti variadici come istanza di un tipo di array? È un piacere.
Gare di leggerezza in orbita

In realtà entrambi creano una fetta di stringhe, non un array. Sono cose diverse a Golang.
PointerToConstantChar

Entrambi non creano un "array" di stringhe, creano una "fetta" di stringhe.
Inanc Gumus


1

Semplifica i parametri della funzione. Ecco un esempio ( https://play.golang.org/p/euMuy6IvaM ): Il metodo SampleEllipsis accetta da zero a molti parametri dello stesso tipo ma nel metodo SampleArray è obbligatorio dichiarare gli argomenti .

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{})

}

Ritorna :

Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array 
Sample ellipsis : [A B C]
Sample array 
Sample ellipsis : []
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.