Go dilinde,
[]string
bir dizgi dizisidir
ve ayrıca ...string
parametre olarak kullanıyoruz .
Fark ne?
Fonksiyon tanımı:
func f(args ...string) {}
Bu işlevi aşağıdaki gibi adlandırabilir miyim?
args := []string{"a", "b"}
f(args)
Go dilinde,
[]string
bir dizgi dizisidir
ve ayrıca ...string
parametre olarak kullanıyoruz .
Fark ne?
Fonksiyon tanımı:
func f(args ...string) {}
Bu işlevi aşağıdaki gibi adlandırabilir miyim?
args := []string{"a", "b"}
f(args)
Yanıtlar:
[]string
bir dizgi dizisidir
Teknik olarak, temeldeki bir diziye başvuran bir dilim
ve ayrıca
...string
parametre olarak kullanıyoruz .Fark ne?
Yapıya gelince, gerçekten hiçbir şey yok. Her iki sözdiziminden kaynaklanan veri türü aynıdır.
...
Parametre sözdizimi variadic parametre yapar. Sıfır veya daha fazla string
argümanı kabul edecek ve bunları bir dilim olarak referans gösterecektir.
Çağırmayla ilgili olarak f
, aşağıdaki sözdizimi ile variadic parametreye bir dizi dize geçirebilirsiniz:
func f(args ...string) {
fmt.Println(len(args))
}
args := []string{"a", "b"}
f(args...)
Bu sözdizimi, ya değişmez sözdizimi kullanılarak oluşturulan dilim için ya da variadik parametreyi temsil eden dilim için kullanılabilir (çünkü aralarında gerçekten bir fark yoktur) .
[]string
sözdizimi kullanılarak oluşturulan dilim arasındaki fark hakkında sorulan soruyu yanıtlıyor . Daha açık hale getirmek için cevabıma daha fazla alıntı ekleyeceğim. :-)
Her ikisi de bir dizi dize oluşturur, ancak fark, nasıl adlandırıldığındadır.
func f(args ...string) {
}
// Would be called like this:
f("foo","bar","baz");
Bu, değişken sayıda bağımsız değişkeni (tümü aynı türde) kabul etmenize olanak sağlar
Bunun harika bir örneği, fmt.Print
istediğiniz kadar az veya çok sayıda arugment kabul edebilen ve arkadaşlar.
def fn(*args)
yapısıyla neredeyse aynı .
İşte istediğiniz şey:
var args []string = []string{"A", "B", "C"}
func Sample(args ...string) {
for _, arg := range args {
fmt.Println(arg)
}
}
func main() {
Sample(args...)
}
Oynatın: http://play.golang.org/p/N1ciDUKfG1
Fonksiyon parametrelerinizi basitleştirir. İşte bir örnek ( https://play.golang.org/p/euMuy6IvaM ): Yöntem SampleEllipsis sıfırdan aynı türden birçok parametreyi kabul eder, ancak SampleArray yönteminde bildirilmesi zorunlu argümanlardır .
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{})
}
İadeler :
Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array
Sample ellipsis : [A B C]
Sample array
Sample ellipsis : []
[]string
bir dilimdir, dizi değil. Bir dizi ve dilim arasındaki farklar ince ama önemlidir.