我能做到:
_, ok := some_go_map[a_key]
测试密钥是否存在。
但是我被Python的dict的setdefault方法所破坏(如果一个键没有在“map”[dict == associative array]中设置值,将它设置为给定的默认值,然后得到它;否则只是得到它)。
想知道Go中是否有一些成语可以达到同样的目的?
答案 0 :(得分:8)
请注意,Go的默认行为是在查找密钥丢失时为值类型(例如0
或""
)返回“zero value”,因此如果默认你想要的就是那个,你已经完成了。
重复关于Buddy和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))
}
答案 1 :(得分: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中。通常,你只需要内联。
答案 2 :(得分: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"))
}