2013-11-27 47 views
6

我可以這樣做:Go的setdefault等價嗎?

_, ok := some_go_map[a_key] 

來測試鍵值的存在。但是我被Python的dict的setdefault方法所迷惑(如果一個鍵沒有在「map」[dict ==關聯數組]中設置值,將其設置爲給定的默認值,然後獲取它;否則只是得到)。

想知道Go是否有一些成語來達到同樣的效果?

+0

在python中,你總是可以使用'defaultdict'。 – thefourtheye

+0

呃,我知道,但我的問題是關於Go有類似的東西到Python(setdefault)。 – LetMeSOThat4U

+0

您可能知道,但是隻要某個鍵不存在於地圖中,Go就會爲您提供值類型的「零值」。 ''''''''''''''''''''''''''''''''''''''''''''''''所以如果零是一個確定的默認值,那麼你很幸運。如果沒有,下面的答案中的任何一個看起來都不錯 - 這是他們的代碼的一個變體,它允許你爲Go的內置行爲行爲使用'[]'並且使用'SetDefault'來設置與 - (非零) - 默認值,on同一本字典: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

注意Go的默認行爲是返回「 zero value「爲值類型(例如,0""),當查找鍵缺失時,所以如果您想要的默認值是,那麼您已經設置好了。

Riffing關閉好友和larsmans的答案,這裏的代碼連接到一個名爲Dict類型的新方法,使您可以使用d[key]對Go的內置行爲或d.SetDefault(key, val) -

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