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

Nó chạy.Bản đồ lồng nhau ở 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) 
} 

Nó cũng chạy.

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) 
} 

Chạy lại!

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

Nhưng nó không thành công !?

Có vấn đề gì với các bản đồ lồng nhau trong Go không? Hoặc không có hỗ trợ nhiều khung cho các bản đồ lồng nhau?

Trả lời

7

zero value cho loại bản đồ là nil. Nó chưa được khởi tạo. Bạn không thể lưu trữ các giá trị trong một bản đồ nil, đó là một hoảng loạn thời gian chạy.

Trong ví dụ cuối cùng của bạn, bạn khởi tạo (bên ngoài) data bản đồ, nhưng không có mục nhập nào. Khi bạn lập chỉ mục nó như data["a"], vì không có mục nhập nào có khóa "a" trong đó, hãy lập chỉ mục nó trả về giá trị bằng không của loại giá trị là nil cho bản đồ. Vì vậy, cố gắng gán cho data["a"]["w"] là một hoảng loạn thời gian chạy.

Bạn phải khởi tạo một bản đồ đầu tiên trước khi lưu trữ các yếu tố trong nó, ví dụ:

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) 

Output (thử nó trên Go Playground):

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

Lưu ý rằng khi bạn khai báo một biến loại bản đồ và khởi tạo nó với một số composite literal (như trong var data = map[string]string{}), cũng được tính là khởi tạo.

Lưu ý rằng bạn cũng có thể khởi tạo bản đồ lồng nhau của bạn với một chữ tổng hợp:

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) 

Output là như nhau. Hãy thử nó trên Go Playground.

+0

Tôi nhận ra tôi đã mã hóa golang với thói quen php :) Rất khó để làm quen với việc mã hóa đầy đủ kiểu an toàn. Nhưng tôi thích nó, cảm ơn bạn rất nhiều vì câu trả lời của bạn. –

+0

Trong trường hợp bản đồ được điền theo kiểu lặp lại, bạn có thể kiểm tra giá trị nil trước khi gán: 'if data [" c "] == nil { \t \t dữ liệu [" c "] = map [string] string {}} 'Điều này giúp tránh mất dữ liệu từ bản đồ của bạn. – J0hnG4lt

Các vấn đề liên quan