नक्शे की सभी कुंजियों को बदलना


316

क्या एक गो भाषा के नक्शे में सभी कुंजियों की सूची प्राप्त करने का एक तरीका है? तत्वों की संख्या द्वारा दिया गया है len(), लेकिन अगर मेरे पास कोई नक्शा है जैसे:

m := map[string]string{ "key1":"val1", "key2":"val2" };

मैं सभी कुंजियों पर कैसे पुनरावृति करूं?

जवाबों:


545

https://play.golang.org/p/JGZ7mN0-U-

for k, v := range m { 
    fmt.Printf("key[%s] value[%s]\n", k, v)
}

या

for k := range m {
    fmt.Printf("key[%s] value[%s]\n", k, m[k])
}

forस्टेटमेंट के लिए गो भाषा ऐनक निर्दिष्ट करता है कि पहला मान कुंजी है, दूसरा चर मान है, लेकिन मौजूद नहीं होना चाहिए।


22
संभावित गोच के रूप में, ध्यान दें कि पुनरावृत्ति का क्रम अपरिभाषित है। group.google.com/d/msg/golang-nuts/YfDxpkI34hY/4pktJI2ytusJ
mna

23
सुधीर: गोलंग भाषा कल्पना स्पष्ट रूप से नक्शे को परिभाषित करती है जिसमें चाबियों का अपरिभाषित क्रम होता है। इसके अलावा, गो 1 के बाद से, किसी भी कथित ऑर्डर पर निर्भरता को रोकने के लिए रनों के बीच जानबूझकर यादृच्छिक क्रम बनाया जाता है।
मार्क रेनॉफ

6
ध्यान दें कि यह एक परिवर्तनशील पुनरावृत्ति नहीं है, जो यह कहना है कि एक कुंजी को हटाने से आपको पुनरावृत्ति को पुनः आरंभ करना होगा।
रिक स्मिथ

छोटे डेटा सेटों के लिए भी, मानचित्र क्रम का अनुमान लगाया जा सकता है।
woot

14

यहाँ sliceमानचित्र-कुंजियों को प्राप्त करने का कुछ आसान तरीका है ।

// Return keys of the given map
func Keys(m map[string]interface{}) (keys []string) {
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}

// use `Keys` func
func main() {
    m := map[string]interface{}{
        "foo": 1,
        "bar": true,
        "baz": "baz",
    }
    fmt.Println(Keys(m)) // [foo bar baz]
}

क्या Keysफ़ंक्शन के लिए किसी भी प्रकार की चाबियाँ के साथ नक्शा लेना संभव है , न कि केवल तार?
रॉबर्ट टी। मैकगिबोन

func Keys(m map[interface{}]interface{}) (keys []interface{}), @ RobertT.McGibbon आपको फ़ंक्शन "प्रोटोटाइप" को बदलने की आवश्यकता है
a8m

1
@ArielM। यह केवल सटीक प्रकार के लिए काम करेगा map[interface{}]interface{}। गो, जेनरिक का समर्थन नहीं करता है। आप एक mapपैरामीटर के साथ एक फ़ंक्शन नहीं बना सकते हैं जो विभिन्न प्रकारों के साथ मानचित्रों को स्वीकार करता है।
icza

10

क्या एक गो भाषा के नक्शे में सभी कुंजियों की सूची प्राप्त करने का एक तरीका है?

ks := reflect.ValueOf(m).MapKeys()

मैं सभी कुंजियों पर कैसे पुनरावृति करूं?

स्वीकृत उत्तर का उपयोग करें:

for k, _ := range m { ... }

1
मुझे लगता है कि आपका मतलब है for _, k := range v.MapKeys(), क्योंकि आपके उदाहरण में, kचाबियों के स्लाइस का इंटिमेट इंडेक्स होगा
ब्रायन लीशमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.