Was ist der Unterschied zwischen [] string und… string in golang?

84

In der Go-Sprache

[]string ist ein String-Array

und wir verwenden auch ...stringals Parameter.

Was ist der Unterschied?

Funktionsdefinition:

func f(args ...string) {}

Kann ich diese Funktion wie folgt aufrufen?

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

f(args)
user1746360
quelle

Antworten:

124

[]string ist ein String-Array

Technisch gesehen ist es ein Slice, das auf ein zugrunde liegendes Array verweist

und wir verwenden auch ...stringals Parameter.

Was ist der Unterschied?

In Bezug auf die Struktur nichts wirklich. Der aus beiden Syntax resultierende Datentyp ist der gleiche.

Die ...Parametersyntax erstellt einen variadischen Parameter. Es werden null oder mehr stringArgumente akzeptiert und als Slice referenziert.

In Bezug auf den Aufruf fkönnen Sie ein Stück Zeichenfolgen mit der folgenden Syntax an den variadischen Parameter übergeben:

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


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

f(args...)

Diese Syntax ist entweder für das Slice verfügbar, das mit der Literal-Syntax erstellt wurde, oder für das Slice, das den variadischen Parameter darstellt (da es wirklich keinen Unterschied zwischen ihnen gibt) .

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

Ich hasse Faulheit
quelle
10
[]stringist ein Slice, kein Array. Die Unterschiede zwischen einem Array und einem Slice sind subtil, aber wichtig.
Stephen Weinberg
@StephenWeinberg: Ja, meine Antwort "Nichts wirklich" auf das Zitat "Was ist der Unterschied?" Beantwortet die Frage, die nach dem Unterschied zwischen dem durch den variadischen Funktionsparameter erzeugten Slice und dem mit der []stringSyntax erstellten Slice gestellt wurde . Ich werde meiner Antwort mehr von dem Zitat hinzufügen, um es klarer zu machen. :-)
Ich hasse faul
@IHateLazy Gibt es eine Möglichkeit, eingebaute Funktionen printlnmit Auslassungspunkten zu erstellen ? Hier finden Sie meine Experimente. Wenn jemand einige Debug-Druckfunktionen wünscht, schau dir mein Playgound an.
Gewölbe
14

Beide erstellen ein Array von Zeichenfolgen, aber der Unterschied besteht darin, wie es aufgerufen wird.

func f(args ...string) {

}
// Would be called like this:

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

Auf diese Weise können Sie eine variable Anzahl von Argumenten akzeptieren (alle vom gleichen Typ).

Ein fmt.Printgutes Beispiel dafür sind Freunde, die so wenige oder so viele Arugments akzeptieren können, wie Sie möchten.

tylerl
quelle
Ich bin kein Go-Experte, aber ist nicht eines der variadischen Argumente und das andere ein einzelnes Array-Argument, und unterscheiden sich die beiden nicht wie in anderen Sprachen?
Leichtigkeitsrennen im Orbit
1
@ LightnessRacesinOrbit Yup. Wenn das nicht klar ist, entschuldigen Sie die Verwirrung. Die erste Zeile über beide, die ein Array erstellen, bedeutet nur, dass das resultierende Argument in beiden Fällen ein Array ist. Es ist fast identisch mit Pythons def fn(*args)Konstruktion.
Tyler
Go macht also verschiedene Argumente als Instanz eines Array-Typs verfügbar? Das ist erfreulich.
Leichtigkeitsrennen im Orbit
Tatsächlich erstellen beide ein Stück Zeichenfolgen, kein Array. Sie sind verschiedene Dinge in Golang.
PointerToConstantChar
Beide erstellen kein "Array" von Zeichenfolgen, sondern ein "Slice" von Zeichenfolgen.
Inanc Gumus
5

Folgendes möchten Sie:

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

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

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

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

Ertuğrul
quelle
1

Es vereinfacht Ihre Funktionsparameter. Hier ist ein Beispiel ( https://play.golang.org/p/euMuy6IvaM ): Methode SampleEllipsis nimmt von Null auf viele Parameter desselben Typs , aber in dem Verfahren ist es zwingend sample args deklariert werden.

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

}

Kehrt zurück :

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
quelle