我可以這樣做:Go的setdefault等價嗎?
_, ok := some_go_map[a_key]
來測試鍵值的存在。但是我被Python的dict的setdefault方法所迷惑(如果一個鍵沒有在「map」[dict ==關聯數組]中設置值,將其設置爲給定的默認值,然後獲取它;否則只是得到)。
想知道Go是否有一些成語來達到同樣的效果?
我可以這樣做:Go的setdefault等價嗎?
_, ok := some_go_map[a_key]
來測試鍵值的存在。但是我被Python的dict的setdefault方法所迷惑(如果一個鍵沒有在「map」[dict ==關聯數組]中設置值,將其設置爲給定的默認值,然後獲取它;否則只是得到)。
想知道Go是否有一些成語來達到同樣的效果?
您可以自己始終定義它:
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。通常,你只需要內聯這樣做。
據我所知,沒有這樣的事情內置的。你可以添加一個類型,以幫助
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"))
}
注意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))
}
在python中,你總是可以使用'defaultdict'。 – thefourtheye
呃,我知道,但我的問題是關於Go有類似的東西到Python(setdefault)。 – LetMeSOThat4U
您可能知道,但是隻要某個鍵不存在於地圖中,Go就會爲您提供值類型的「零值」。 ''''''''''''''''''''''''''''''''''''''''''''''''所以如果零是一個確定的默認值,那麼你很幸運。如果沒有,下面的答案中的任何一個看起來都不錯 - 這是他們的代碼的一個變體,它允許你爲Go的內置行爲行爲使用'[]'並且使用'SetDefault'來設置與 - (非零) - 默認值,on同一本字典:http://play.golang.org/p/5SIJSWNWO7 – twotwotwo