在Go中等同于setdefault?

时间:2013-11-27 19:29:52

标签: python go

我能做到:

_, ok := some_go_map[a_key]

测试密钥是否存在。

但是我被Python的dict的setdefault方法所破坏(如果一个键没有在“map”[dict == associative array]中设置值,将它设置为给定的默认值,然后得到它;否则只是得到它)。

想知道Go中是否有一些成语可以达到同样的目的?

3 个答案:

答案 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"))
}