Na linguagem Go,
[]string
é um array de string
e também usamos ...string
como 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)
[]string
é um array de string
Tecnicamente, é uma fatia que faz referência a uma matriz subjacente
e também usamos
...string
como 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 string
argumentos 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) .
[]string
é uma fatia, não uma matriz. As diferenças entre uma matriz e uma fatia são sutis, mas importantes.[]string
sintaxe. Acrescentarei mais da citação à minha resposta para torná-la mais clara. :-)println
funcionar 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.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.Print
e amigos, que podem aceitar quantos argumentos você quiser.fonte
def fn(*args)
construção do python .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
fonte
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:
fonte