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

में स्थित नक्शे।गोलांग

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

यह भी चलता है।

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

यह फिर से चलता है!

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

लेकिन यह विफल रहता है !?

क्या गो में नेस्टेड मानचित्रों में कोई समस्या है? या नेस्टेड मानचित्रों के लिए कोई एकाधिक ब्रैकेट समर्थन नहीं है?

उत्तर

7

zero value मानचित्र प्रकारों के लिए nil है। यह अभी तक शुरू नहीं हुआ है। आप nil मानचित्र में मानों को संग्रहीत नहीं कर सकते हैं, यह एक रनटाइम दहशत है।

अपने अंतिम उदाहरण में आप (बाहरी) data मानचित्र प्रारंभ करें, लेकिन इसमें कोई प्रविष्टियां नहीं हैं। जब आप इसे data["a"] की तरह अनुक्रमित करते हैं, क्योंकि इसमें "a" कुंजी के साथ कोई प्रविष्टि नहीं है, तो यह अनुक्रमणित करता है कि यह मान प्रकार के शून्य मान को वापस करता है जो नक्शे के लिए nil है। तो data["a"]["w"] को असाइन करने का प्रयास एक रनटाइम आतंक है।

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) 

आउटपुट (Go Playground पर यह कोशिश):

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

नोट है कि जब आप एक चर घोषित

उदाहरण के लिए आप उस में तत्वों भंडारण से पहले एक नक्शा प्रारंभ करने में पहले है मानचित्र प्रकार का और इसे composite literal (var data = map[string]string{} में) के साथ प्रारंभ करें, जो प्रारंभ करने के रूप में भी गिना जाता है।

ध्यान दें कि आप भी एक समग्र शाब्दिक के साथ अपने नेस्टेड नक्शे प्रारंभ हो सकता है:

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) 

आउटपुट में ही है। इसे Go Playground पर आज़माएं।

+0

मुझे एहसास हुआ कि मैं php आदतों के साथ गोलांग कोडिंग कर रहा था :) पूर्ण प्रकार-सुरक्षित में कोडिंग करने के लिए उपयोग करना मुश्किल है। लेकिन मुझे यह पसंद है, आपके उत्तर के लिए बहुत बहुत धन्यवाद। –

+0

यदि मानचित्र को क्रमशः पॉप्युलेट किया जा रहा है, तो आप असाइनमेंट से पहले एक शून्य मान की जांच कर सकते हैं: 'यदि डेटा ["सी"] == शून्य { \t डेटा ["सी"] = मानचित्र [स्ट्रिंग] स्ट्रिंग {}} 'यह आपके मानचित्र से डेटा खोने से बचने में मदद करता है। – J0hnG4lt