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.