हटाएं नक्शा [कुंजी] जाने में?


166

मेरे पास एक नक्शा है:

var sessions =  map[string] chan int{}

मैं कैसे हटाऊं sessions[key]? मैंने कोशिश की:

sessions[key] = nil,false;

यह काम नहीं किया।


अपडेट (नवंबर 2011):

मानचित्र प्रविष्टियों को हटाने के लिए विशेष सिंटैक्स को गो संस्करण 1 में हटा दिया जाता है :

जाओ 1 विशेष मानचित्र असाइनमेंट को हटा देगा और एक नया बिल्ट-इन फ़ंक्शन पेश करेगा delete: delete(m, x)अभिव्यक्ति द्वारा पुनर्प्राप्त मानचित्र प्रविष्टि को हटा देगा m[x]। ...

जवाबों:


154

काफी अजीब है,

package main

func main () {
    var sessions = map[string] chan int{};
    delete(sessions, "moo");
}

काम करने लगता है। यह संसाधनों का एक खराब उपयोग लगता है!

एक और तरीका है अस्तित्व की जाँच करना और मूल्य का स्वयं उपयोग करना:

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}

मूल्य को देखते हुए और इसका पुन: उपयोग करना सस्ता होना चाहिए: sessions["moo"] = sessions["moo"], false;(या यह गलत है?)
u0b34a0f6ae

जब तक कि कुंजी मौजूद नहीं होती है तब तक क्रैश हो जाता है। मैंने आपके विचार के आधार पर एक और समाधान जोड़ा है।

1
क्या यह सुरक्षित है, जबकि मानचित्र को स्वयं के लिए उपयोग करना सुरक्षित है?
जॉर्ज रामिरेज़

@ जॉर्ज रामिरेज़ मैं ऐसा नहीं मानता। यदि आप ऐसा करना चाहते हैं, तो मानचित्र ऑब्जेक्ट के बजाय कुंजी के एक टुकड़े पर पुनरावृति करने का एक तरीका खोजें
Seaux

5
दूसरा समाधान संसाधनों का बेहतर उपयोग क्यों है? दूसरे समाधान में आप दो मुख्य लुकअप करते हैं, जबकि पहले समाधान में, आप एक कुंजी लुकअप करते हैं।
thebiggestlebowski

86

गो 1 रिलीज़ नोट से कॉपी किया गया

पुरानी भाषा में, kद्वारा प्रस्तुत नक्शे से कुंजी के साथ प्रविष्टि को हटाने के लिए m, एक ने बयान लिखा,

m[k] = value, false

यह वाक्यविन्यास एक विशेष मामला था, केवल दो-से-एक असाइनमेंट। इसके लिए एक मूल्य (आमतौर पर नजरअंदाज) को पारित करने की आवश्यकता होती है जिसका मूल्यांकन किया जाता है लेकिन त्याग दिया जाता है, साथ ही एक बूलियन जो लगभग हमेशा असत्य था। इसने काम तो किया लेकिन अजीब और विवाद का एक बिंदु था।

Go 1 में, वह सिंटैक्स गया है; बजाय वहाँ, एक नया निर्मित समारोह delete। कॉल

delete(m, k)

अभिव्यक्ति द्वारा पुनर्प्राप्त मानचित्र प्रविष्टि को हटा देगा m[k]। कोई रिटर्न वैल्यू नहीं है। गैर-मौजूद प्रविष्टि को हटाना एक नो-ऑप है।

अद्यतन कर रहा है: चल रहा है go fixफार्म के भाव में परिवर्तित कर देंगे m[k] = value, falseमें delete(m, k)जब यह स्पष्ट है कि ध्यान नहीं दिया मूल्य सुरक्षित रूप से इस कार्यक्रम से खारिज किया जा सकता है और falseपूर्वनिर्धारित बूलियन लगातार को दर्शाता है। फिक्स टूल प्रोग्रामर द्वारा निरीक्षण के लिए सिंटैक्स के अन्य उपयोगों को चिह्नित करेगा।


54

से प्रभावी जाओ :

मानचित्र प्रविष्टि को हटाने के लिए, हटाए गए फ़ंक्शन का उपयोग करें, जिनके तर्क मानचित्र और हटाए जाने की कुंजी हैं। यह करना सुरक्षित है भले ही कुंजी पहले से ही नक्शे से अनुपस्थित हो।

delete(timeZone, "PDT")  // Now on Standard Time

sessions.go:6: cannot use 0 (type int) as type chan int

3
@Kinopiko: मुझे नहीं लगता कि Jurily ओपी के लिए उस कोड स्निपेट का उपयोग करना था। उन्होंने केवल डॉक्स से एक उदाहरण की प्रतिलिपि बनाई।
यशायाह

2
लगता है इस तरह से हटा दिया गया है, हो रही हैassignment count mismatch: 1 = 2 (use delete)
ghayes


0

के make (chan int)बजाय का उपयोग करें nil। पहला मान उसी प्रकार का होना चाहिए जो आपका मानचित्र रखता है।

package main

import "fmt"

func main() {

    var sessions = map[string] chan int{}
    sessions["somekey"] = make(chan int)

    fmt.Printf ("%d\n", len(sessions)) // 1

    // Remove somekey's value from sessions
    delete(sessions, "somekey")

    fmt.Printf ("%d\n", len(sessions)) // 0
}

अद्यतन: मेरे उत्तर को सही किया।


sessions.go:6: cannot use 0 (type int) as type chan int

उफ़, भूल गया कि मैंने उसे भी हटा दिया: पी
यशायाह

package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}

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