रनटाइम त्रुटि: शून्य मानचित्र में प्रविष्टि के लिए असाइनमेंट


101

मैं एक नक्शा बनाने की कोशिश कर रहा हूं और फिर इसे इस तरह एक यमल फ़ाइल में परिवर्तित कर रहा हूं:

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

जवाबों:


136

आपने अपने आंतरिक मानचित्र को प्रारंभ नहीं किया है। अपने लूप के लिए पहले आप जोड़ सकते हैं m["uid"] = make(map[string]T)और फिर नाम निर्दिष्ट कर सकते हैं ।


20

आपको यह जांचना चाहिए कि क्या नक्शा शून्य है और एक को इनिशियलाइज़ करें यदि यह लूप के लिए अंदर है:

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

5

त्रुटि के अनुसार बात है

assignment to entry in nil map

नेस्टेड मैप्स के लिए जब गहरे स्तर की कुंजी को असाइन किया जाता है तो हमें निश्चित होना चाहिए कि इसकी बाहरी कुंजी का मूल्य है। और यह कहेंगे कि नक्शा शून्य है। उदाहरण के लिए आपके मामले में

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

मी एक नेस्टेड मैप है जिसमें मूल्य के stringसाथ कुंजी है map[string]T। और आप मान असाइन कर रहे हैं

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

यहाँ आप देख सकते हैं m["uid"]है nilऔर हम यह स्पष्ट करते हैं उसमें कोई मान [name]किस प्रकार की नेस्टेड मूल्य के लिए एक महत्वपूर्ण है T। तो सबसे पहले आपको "uid" पर मान असाइन करना होगा या इसे इनिशियलाइज़ करना होगा

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

1

@ माकपोक ने पहले ही सवाल का जवाब दिया। बस कुछ अतिरिक्त जानकारी जोड़ने।

मानचित्र प्रकार संदर्भ प्रकार हैं, जैसे संकेत या स्लाइस, और इसलिए ऊपर m का मान शून्य है; यह एक प्रारंभिक नक्शे की ओर इशारा नहीं करता है। पढ़ते समय एक शून्य मानचित्र एक खाली मानचित्र की तरह व्यवहार करता है, लेकिन एक शून्य मानचित्र पर लिखने का प्रयास एक रनटाइम आतंक का कारण होगा; ऐसा मत करो। मानचित्र के बारे में अधिक जानकारी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.