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.