2013-11-27 8 views

cevap

23

oldukça büyük bir fark yaratıyor: Fark array ve slice arasındadır.

[]string, bir dizi diziye işaret eden bir dilim oluşturur. Diğer yandan, [...], bir gerçek dizi dizesi oluşturur.

Mükemmel bir blog post golang blogunda ikisi arasındaki fark hakkında. Burada yapabileceğim en iyi şekilde özetlemeye çalışacağım.

Golang dizileri, değer türleri gibidir, belirli bir türe referanslardır ve her zaman belirli bir uzunluktadır. 1) açık uzunluğu ve 2) kapalı uzunluk:

// Explicit length. 
var days := [7]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

// Implicit length. (Let the compiler figure it out how long it is) 
var days := [...]string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

Bu iki eşdeğer dizi tanımlarıdır bir dizi oluşturmak için iki yol vardır. Bir dizinin uzunluğunun, tür tanımının bölüm olduğunu unutmayın. Yani, farklı uzunluklarda ile benzer türdeki değil kavşak diziler olabilir: Ayrıca

// These two are not interchangeable! 
var someArray [5]string; 
var otherArray [10]string; 

func work(data [5]string) { /* ... */ } 

work(someArray) // good 
work(otherArray) // not so good 

, diziler, yapılar gibi, dizinin bir kopyası bir işleve verilecektir değeri – olarak yansıtılması anlamına değil unutmayın bunun için bir referans ..

Dilimleri diğer türlerde referans türleri gibidir. Bir dizi tarafından desteklenirler, ancak daha esnektirler. Dizideki bir pozisyona bir işaretçi, bir uzunluk ve bir kapasite içerir.

// Create a slice 
var days := []string { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" } 

Dilimler, diziler farklı olarak, açık bir şekilde kendi uzunluğuna bağlı değildir ve farklı uzunluklarda dilimler birbirlerine geçirilebilir. Aynı zamanda bir işaretçi gibi davranırlar, bu da değer yerine referans olarak geçtikleri anlamına gelir.

Go Data Structures hakkında harika bir yazı ve bunların bellekte nasıl göründükleri de vardır. Bunu kontrol etmenizi tavsiye ederim.

+1

İkinci örneğinizde 'someArray' ve' otherArray' uzunluklarını değiştirmelisiniz :) –

+0

@VladimirMatveev good catch :) –