ข้อผิดพลาดรันไทม์: การกำหนดรายการใน nil map


105

ฉันพยายามสร้างแผนที่จากนั้นแปลงเป็นไฟล์ yaml ดังนี้:

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

ฉันคิดว่าฉันพลาดบางอย่างที่สำคัญในขณะที่สร้างแผนที่ รหัสของฉันอยู่ด้านล่าง

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

มันให้ข้อผิดพลาดต่อไปนี้:

panic: runtime error: assignment to entry in nil map

คำตอบ:


144

คุณยังไม่ได้เริ่มต้นแผนที่ภายในของคุณ ก่อนการวนซ้ำของคุณคุณสามารถเพิ่มm["uid"] = make(map[string]T)และกำหนดชื่อได้


25

คุณควรตรวจสอบว่าแผนที่เป็นศูนย์หรือไม่และเริ่มต้นใหม่หากไม่มีในลูป for:

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

4

มีสิ่งตามข้อผิดพลาด

assignment to entry in nil map

สำหรับแผนที่ที่ซ้อนกันเมื่อกำหนดให้กับคีย์ระดับลึกเราต้องมั่นใจว่าคีย์ด้านนอกมีค่า มิฉะนั้นจะบอกว่าแผนที่เป็นศูนย์ เช่นในกรณีของคุณ

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

m เป็นแผนที่ซ้อนกันซึ่งมีstringคีย์map[string]Tเป็นค่า และคุณจะกำหนดค่า

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

ที่นี่คุณสามารถดูm["uid"]เป็นnilและเราจะระบุว่ามีค่าซึ่งเป็นกุญแจสำคัญที่จะคุ้มค่าที่ซ้อนกันของชนิด[name] Tก่อนอื่นคุณต้องกำหนดค่าให้กับ "uid" หรือเริ่มต้นเป็น

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

0

@ Makpoc ตอบคำถามแล้ว เพียงแค่เพิ่มข้อมูลพิเศษบางอย่าง

ประเภทแผนที่คือประเภทอ้างอิงเช่นพอยน์เตอร์หรือสไลซ์ดังนั้นค่าของ m ด้านบนจึงเป็นศูนย์ มันไม่ได้ชี้ไปที่แผนที่เริ่มต้น แผนที่ศูนย์ทำงานเหมือนแผนที่ว่างเปล่าเมื่ออ่าน แต่ความพยายามที่จะเขียนลงในแผนที่ศูนย์จะทำให้รันไทม์ตื่นตระหนก อย่าทำอย่างนั้น ข้อมูลเพิ่มเติมเกี่ยวกับแผนที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.