2013-11-27 5 views
6

मैं कर सकते हैं:गो में सेटडेफॉल्ट के समतुल्य?

_, ok := some_go_map[a_key] 

कुंजी के अस्तित्व के लिए परीक्षण करने के लिए।

लेकिन मुझे पायथन के निर्देश की सेटडेफॉल्ट विधि से खराब कर दिया गया है (यदि किसी कुंजी के पास "मानचित्र" [dict == सहयोगी सरणी] में मान सेट नहीं है, तो इसे किसी दिए गए डिफ़ॉल्ट पर सेट करें, फिर इसे प्राप्त करें; अन्यथा बस प्राप्त)।

आश्चर्य है कि क्या एक ही चीज़ प्राप्त करने के लिए गो में कुछ मुहावरे है?

+0

पायथन में, आप हमेशा 'डिफ़ॉल्ट डिक्ट' का उपयोग कर सकते हैं। – thefourtheye

+0

एआरएम मुझे पता है लेकिन मेरा सवाल पाइथन (setdefault) के समान काम करने के बारे में है। – LetMeSOThat4U

+0

आपको पता हो सकता है, लेकिन जब भी कोई नक्शा किसी मानचित्र में पहले से मौजूद नहीं होता है, तो गो आपको मूल्य प्रकार का "शून्य मान" देता है। '''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' तो यदि शून्य एक ठीक डिफ़ॉल्ट मान है, तो आप भाग्य में हैं। यदि नहीं, तो नीचे दिए गए उत्तरों में से कोई भी अच्छा दिखता है - यहां उनके कोड की एक भिन्नता है जो आपको गो के अंतर्निर्मित व्यवहार के लिए '[]' और सेट-अप- (nonzero) -default के लिए 'SetDefault' का उपयोग करने की अनुमति देती है। वही शब्दकोश: http://play.golang.org/p/5SIJSWNWO7 – twotwotwo

उत्तर

6

तुम हमेशा यह अपने आप को परिभाषित कर सकते हैं:

func setDefault(h map[string]int, k string, v int) (set bool, r int) { 
    if r, set = h[k]; !set { 
     h[k] = v 
     r = v 
     set = true 
    } 
    return 
} 

लेकिन नहीं, यह stdlib में नहीं है। आमतौर पर, आप बस इनलाइन करते हैं।

1

जहाँ तक मुझे पता है, वहाँ नहीं में बनाया ऐसा ही कुछ है। आप

http://play.golang.org/p/pz34p7w6fP

package main 

import "fmt" 

type Default struct { 
    vals  map[string]int 
    defaults int 
} 

func (d *Default) Get(key string) int { 
    if val, ok := d.vals[key]; ok { 
     return val 
    } 
    return d.defaults 
} 

func main() { 
    someMap := Default{map[string]int{"foo": 1, "bar": 2}, 5} 
    fmt.Println(someMap.Get("foo")) 
    fmt.Println(someMap.Get("doesn't exist")) 
} 
5

ध्यान दें कि जाओ का डिफ़ॉल्ट व्यवहार लौटने "करने के लिए है मदद करने के लिए एक प्रकार का जोड़ सकते हैं zero value "मान प्रकार के लिए (उदाहरण के लिए, 0 या "") जब एक लुक-अप कुंजी गुम हो जाती है, तो यदि आप चाहते हैं कि डिफ़ॉल्ट हो, तो आप पहले से ही सेट हो चुके हैं।

http://play.golang.org/p/5SIJSWNWO7

package main 

import "fmt" 

type Dict map[string]float64 

func (d Dict) SetDefault(key string, val float64) (result float64) { 
    if v, ok := d[key]; ok { 
     return v 
    } else { 
     d[key] = val 
     return val 
    } 
} 

func main() { 
    dd := Dict{} 
    dd["a"] = 3 
    fmt.Println(dd.SetDefault("a", 1)) 
    fmt.Println(dd.SetDefault("b", 2)) 
} 
- आपके द्वारा जाएं के अंतर्निहित व्यवहार या d.SetDefault(key, val) के लिए d[key] उपयोग कर सकते हैं

बडी और larsmans 'उत्तर बंद riffing, यहाँ कोड है कि एक नामित Dict प्रकार करने के लिए एक नई विधि देता है, तो या तो