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)

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


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.


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


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 : []
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.