在Go中等同于setdefault?

Let*_*t4U 8 python go

我可以:

_, ok := some_go_map[a_key]
Run Code Online (Sandbox Code Playgroud)

测试密钥的存在.

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

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

two*_*two 8

注意,Go的默认行为是在查找键丢失时返回值类型的" 零值 "(例如,0""),因此如果您想要的默认值恰好是那个,那么您已经完成了设置.

重复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))
}
Run Code Online (Sandbox Code Playgroud)


Fre*_*Foo 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
}
Run Code Online (Sandbox Code Playgroud)

但不,它不在stdlib中.通常,你只是内联.