2017-06-01 27 views
6
func main() { 
    var data = map[string]string{} 
    data["a"] = "x" 
    data["b"] = "x" 
    data["c"] = "x" 
    fmt.Println(data) 
} 

Çalışıyor.İç içe yerleştirme haritaları, Golang

func main() { 
    var data = map[string][]string{} 
    data["a"] = append(data["a"], "x") 
    data["b"] = append(data["b"], "x") 
    data["c"] = append(data["c"], "x") 
    fmt.Println(data) 
} 

Ayrıca çalışır.

func main() { 
    var w = map[string]string{} 
    var data = map[string]map[string]string{} 
    w["w"] = "x" 
    data["a"] = w 
    data["b"] = w 
    data["c"] = w 
    fmt.Println(data) 
} 

Yine çalışır!

func main() { 
    var data = map[string]map[string]string{} 
    data["a"]["w"] = "x" 
    data["b"]["w"] = "x" 
    data["c"]["w"] = "x" 
    fmt.Println(data) 
} 

Ama bu başarısız !?

Go'da iç içe geçmiş haritaları ile ilgili bir sorun var mı? Yoksa iç içe geçmiş haritalar için çoklu destek desteği yok mu?

cevap

7

Harita türleri için zero valuenil şeklindedir. Henüz başlatılmadı. Değerleri bir nil haritasında saklayamazsınız, bu bir çalışma zamanı panikidir.

Son örneğinizde (dış) data eşlemini başlatırsınız, ancak girişleri yoktur. data["a"] gibi bir dizini indekslediğinizde, "a" anahtarıyla henüz giriş olmadığından, indeksleme, haritalar için nil olan değer türünün sıfır değerini döndürür. Bu nedenle, data["a"]["w"]'a atanmaya çalışmak bir çalışma zamanı panikidir. Bir değişkeni bildirir zaman o

map[a:map[w:x] b:map[w:x] c:map[w:x]] 

Not:

var data = map[string]map[string]string{} 

data["a"] = map[string]string{} 
data["b"] = make(map[string]string) 
data["c"] = make(map[string]string) 

data["a"]["w"] = "x" 
data["b"]["w"] = "x" 
data["c"]["w"] = "x" 
fmt.Println(data) 

Çıktı (Go Playground üzerinde denemek):

Örneğin, içindeki unsurları saklamadan önce ilk bir harita başlatmak zorunda harita türünü ve composite literal (var data = map[string]string{}'daki gibi) ile başlatabilir, bu da başlatıcı olarak sayılır. Ayrıca kompozit sabitin ile iç içe haritalar başlatmak olabilir

Not:

var data = map[string]map[string]string{ 
    "a": map[string]string{}, 
    "b": map[string]string{}, 
    "c": map[string]string{}, 
} 

data["a"]["w"] = "x" 
data["b"]["w"] = "x" 
data["c"]["w"] = "x" 
fmt.Println(data) 

Çıktı aynıdır. Go Playground'da deneyin.

+0

Php alışkanlıklarıyla golang kodlaması yaptığımı anladım :) Kodlamaya alışmak çok zor. Ama beğendim, cevabınız için çok teşekkürler. –

+0

Haritanın yinelemeli olarak doldurulması durumunda, atamadan önce sıfır değerini kontrol edebilirsiniz: 'data [" c "] == nil { \t \t data [" c "] = harita [string] dizgisi {}} 'Bu, haritanızdaki verilerin kaybolmasını önlemeye yardımcı olur. – J0hnG4lt