Golang'da [] string ve… string arasındaki fark nedir?


85

Go dilinde,

[]string bir dizgi dizisidir

ve ayrıca ...stringparametre 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:


126

[]string bir dizgi dizisidir

Teknik olarak, temeldeki bir diziye başvuran bir dilim

ve ayrıca ...stringparametre 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 stringargü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) .

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


10
[]stringbir dilimdir, dizi değil. Bir dizi ve dilim arasındaki farklar ince ama önemlidir.
Stephen Weinberg

@StephenWeinberg: Evet, "fark nedir" alıntısına verdiğim "gerçekten hiçbir şey" cevabım, variadic fonksiyon parametresi tarafından oluşturulan dilim ile []stringsö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. :-)
I Hate Lazy

@IHateLazy Yerleşik printlnüç nokta ile çalışmasını sağlamanın bir yolu var mı ? Burada deneylerimi bulabilirsiniz. Birisi bazı hata ayıklama yazdırma işlevlerini istiyorsa, oyun oynamaya gidin.
vault

14

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.Printistediğiniz kadar az veya çok sayıda arugment kabul edebilen ve arkadaşlar.


Go uzmanı değilim, ancak bir değişken argüman ve diğeri tek bir dizi argümanı değil ve ikisi diğer dillerdeki gibi farklı değil mi?
Orbit'te Hafiflik Yarışları

1
@LightnessRacesinOrbit Yup. Bu net değilse kafa karışıklığı için özür dilerim. Her ikisinin de bir dizi oluşturmasıyla ilgili ilk satır, her iki durumda da ortaya çıkan argümanın bir dizi olduğu anlamına gelir. Python'un def fn(*args)yapısıyla neredeyse aynı .
tylerl

Öyleyse Go, bir dizi türünün bir örneği olarak çeşitli argümanları ortaya çıkarır? Bu sevindirici.
Orbit'te Hafiflik Yarışları

Aslında ikisi de bir dizi değil, bir dizi dize oluşturur. Golang'da farklı şeylerdir.
PointerToConstantChar

Her ikisi de bir dizi "dizisi" oluşturmaz, bir dizi "dilimi" oluşturur.
İnanç Gümüş


1

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 : []
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.