Lỗi thời gian chạy: gán cho mục nhập trong bản đồ nil


101

Tôi đang cố gắng tạo bản đồ và sau đó chuyển đổi bản đồ đó thành tệp yaml như sau:

uid :
      kasi:
        cn: Chaithra
        street: fkmp
      nandan:
        cn: Chaithra
        street: fkmp
      remya:
        cn: Chaithra
        street: fkmp

Tôi nghĩ rằng tôi đang thiếu một cái gì đó quan trọng trong khi tạo bản đồ. Mã của tôi ở dưới đây.

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
)

type T struct {
    cn     string
    street string
}

func main() {
    names := []string{"kasi", "remya", "nandan"}

    m := make(map[string]map[string]T, len(names))
    for _, name := range names {

        //t := T{cn: "Chaithra", street: "fkmp"}

        m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}

    }
    fmt.Println(m)

    y, _ := yaml.Marshal(&m)

    fmt.Println(string(y))
    //fmt.Println(m, names)
}

Nó đang đưa ra lỗi sau:

panic: runtime error: assignment to entry in nil map

Câu trả lời:


136

Bạn chưa khởi tạo bản đồ bên trong của mình. Trước vòng lặp for của bạn, bạn có thể thêm m["uid"] = make(map[string]T)và sau đó gán tên.


20

Bạn nên kiểm tra xem bản đồ có phải là nil không và khởi tạo một bản đồ nếu nó là nil bên trong vòng lặp for:

if m["uid"] == nil {
    m["uid"] = map[string]T{}
}

5

Có điều theo lỗi

assignment to entry in nil map

Đối với các bản đồ lồng nhau khi gán cho khóa cấp sâu, chúng ta cần chắc chắn rằng khóa ngoài của nó có giá trị. Nếu không, nó sẽ nói rằng bản đồ là con số không. Ví dụ trong trường hợp của bạn

m := make(map[string]map[string]T, len(names))

m là một bản đồ lồng nhau chứa stringkhóa với map[string]Tgiá trị là. Và bạn đang chỉ định giá trị

m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}

ở đây bạn có thể thấy m["uid"]nilvà chúng tôi đang nói rằng nó chứa một giá trị [name]là khóa cho giá trị lồng nhau của kiểu T. Vì vậy, trước tiên bạn cần gán giá trị cho "uid" hoặc khởi tạo nó bằng

m["uid"] = make(map[string]T)

1

@Makpoc đã trả lời câu hỏi. chỉ thêm một số thông tin bổ sung.

Các loại bản đồ là các loại tham chiếu, như con trỏ hoặc lát cắt, và do đó giá trị của m ở trên là 0; nó không trỏ đến một bản đồ đã khởi tạo. Một bản đồ nil hoạt động giống như một bản đồ trống khi đọc, nhưng việc cố gắng ghi vào một bản đồ nil sẽ gây ra sự hoảng loạn về thời gian chạy; đừng làm vậy. thêm thông tin về Bản đồ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.