Qual é a diferença entre [] string e… string em golang?

85

Na linguagem Go,

[]string é um array de string

e também usamos ...stringcomo parâmetro.

Qual é a diferença?

Definição de função:

func f(args ...string) {}

Posso chamar essa função como abaixo?

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

f(args)
user1746360
fonte

Respostas:

126

[]string é um array de string

Tecnicamente, é uma fatia que faz referência a uma matriz subjacente

e também usamos ...stringcomo parâmetro.

Qual é a diferença?

Com relação à estrutura, nada mesmo. O tipo de dados resultante de ambas as sintaxes é o mesmo.

A ...sintaxe do parâmetro torna um parâmetro variável. Ele aceitará zero ou mais stringargumentos e fará referência a eles como uma fatia.

Com relação à chamada f, você pode passar uma parte de strings para o parâmetro variadic com a seguinte sintaxe:

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


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

f(args...)

Essa sintaxe está disponível para a fatia construída usando a sintaxe literal ou para a fatia que representa o parâmetro variável (já que realmente não há diferença entre eles) .

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

Eu odeio preguiçoso
fonte
10
[]stringé uma fatia, não uma matriz. As diferenças entre uma matriz e uma fatia são sutis, mas importantes.
Stephen Weinberg
@StephenWeinberg: Sim, minha resposta "nada realmente" para a citação "qual é a diferença" é responder à pergunta que foi feita sobre a diferença entre a fatia gerada pelo parâmetro de função variada e aquela criada usando a []stringsintaxe. Acrescentarei mais da citação à minha resposta para torná-la mais clara. :-)
I Hate Lazy
@IHateLazy Existe uma maneira de fazer o builtin printlnfuncionar com reticências? Aqui você pode encontrar meus experimentos. Se alguém deseja algumas funções de depuração de impressão, vá assistir meu jogo.
cofre
14

Ambos criam um array de strings, mas a diferença está em como é chamado.

func f(args ...string) {

}
// Would be called like this:

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

Isso permite que você aceite um número variável de argumentos (todos do mesmo tipo)

Um grande exemplo disso é fmt.Printe amigos, que podem aceitar quantos argumentos você quiser.

tylerl
fonte
Não sou especialista em Go, mas um argumento variável e o outro não são um único argumento de matriz, e os dois não são distintos como em outras linguagens?
Lightness Races in Orbit
1
@LightnessRacesinOrbit Sim. Se isso não estiver claro, desculpe a confusão. A primeira linha sobre a criação de um array apenas significa que o argumento resultante em ambas as instâncias é um array. É quase idêntico à def fn(*args)construção do python .
tylerl
Então Go expõe argumentos variadic como uma instância de um tipo de array? Isso é agradável.
Lightness Races in Orbit
Na verdade, os dois criam uma fatia de strings, não um array. Eles são coisas diferentes em Golang.
PointerToConstantChar
Ambos não criam um "array" de strings, eles criam uma "fatia" de strings.
Inanc Gumus 01 de
5

Aqui está o que você deseja:

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

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

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

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

Ertuğrul
fonte
1

Isso simplifica seus parâmetros de função. Aqui está um exemplo ( https://play.golang.org/p/euMuy6IvaM ): O método SampleEllipsis aceita de zero a muitos parâmetros do mesmo tipo, mas no método SampleArray é obrigatório declarar args .

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

}

Retorna:

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
fonte