Jaka jest różnica między ciągiem [] a… stringiem w golang?


85

W języku Go

[]string jest tablicą łańcuchową

i używamy również ...string jako parametru.

Jaka jest różnica?

Definicja funkcji:

func f(args ...string) {}

Czy mogę nazwać tę funkcję jak poniżej?

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

f(args)

Odpowiedzi:


126

[]string jest tablicą łańcuchową

Z technicznego punktu widzenia jest to wycinek, który odwołuje się do podstawowej tablicy

i używamy również...string jako parametru.

Jaka jest różnica?

Jeśli chodzi o strukturę, to naprawdę nic. Typ danych wynikający z obu składni jest taki sam.

...Składnia parametr sprawia, że o zmiennej liczbie argumentów parametru. Przyjmuje zero lub więcej stringargumentów i odwołuje się do nich jako do wycinka.

Jeśli chodzi o wywołanie f, możesz przekazać kawałek ciągów do parametru variadic z następującą składnią:

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


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

f(args...)

Ta składnia jest dostępna albo dla wycinka zbudowanego przy użyciu składni literału, albo dla wycinka reprezentującego parametr wariadyczny (ponieważ tak naprawdę nie ma między nimi różnicy) .

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


10
[]stringjest wycinkiem, a nie tablicą. Różnice między tablicą a plasterkiem są subtelne, ale ważne.
Stephen Weinberg

@StephenWeinberg: Tak, moja odpowiedź „nic naprawdę” na cytat „jaka jest różnica” odpowiada na pytanie, które zostało zadane o różnicę między wycinkiem wygenerowanym przez parametr funkcji wariadycznej a tym utworzonym przy użyciu []stringskładni. Dodam więcej cytatu do mojej odpowiedzi, aby była jaśniejsza. :-)
I Hate Lazy

@IHateLazy Czy istnieje sposób, aby wbudowane printlndziałały z wielokropkiem? Tutaj możesz znaleźć moje eksperymenty. Jeśli ktoś życzy sobie jakichś funkcji debugowania drukowania, zobacz moją zabawę.
skarbiec

14

Obie tworzą tablicę ciągów, ale różnica polega na tym, jak się ją nazywa.

func f(args ...string) {

}
// Would be called like this:

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

Pozwala to na akceptację zmiennej liczby argumentów (wszystkie tego samego typu)

Doskonałym tego przykładem są fmt.Printi przyjaciele, którzy mogą zaakceptować tak mało lub tyle aresztowań, ile chcesz.


Nie jestem ekspertem w Go, ale czy jeden argument wariadyczny, a drugi nie jest pojedynczym argumentem tablicowym, i czy nie są to dwa odrębne argumenty, jak w innych językach?
Wyścigi lekkości na orbicie,

1
@LightnessRacesinOrbit Tak. Jeśli to nie jest jasne, przepraszam za zamieszanie. Pierwsza linia dotycząca tworzenia tablicy w obu przypadkach oznacza po prostu, że wynikowy argument w obu przypadkach jest tablicą. Jest prawie identyczna z def fn(*args)konstrukcją Pythona .
tylerl

Więc Go ujawnia argumenty wariadyczne jako instancję typu tablicowego? To przyjemne.
Wyścigi lekkości na orbicie

Właściwie oboje tworzą kawałek ciągów, a nie tablicę. W Golangu są różne rzeczy.
PointerToConstantChar

Obie nie tworzą „tablicy” ciągów, tworzą „kawałek” ciągów.
Inanc Gumus


1

Upraszcza parametry funkcji. Oto przykład ( https://play.golang.org/p/euMuy6IvaM ): Metoda SampleEllipsis akceptuje od zera do wielu parametrów tego samego typu, ale w metodzie SampleArray wymagane jest zadeklarowanie argumentów .

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

}

Zwroty :

Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array 
Sample ellipsis : [A B C]
Sample array 
Sample ellipsis : []
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.