Dictionary 如何更改地图的默认值

Dictionary 如何更改地图的默认值,dictionary,go,Dictionary,Go,我读到Go将值设置为地图中数据类型的“零值”。我想知道是否有一种简单的方法可以设置不同的默认值,类似于在Python中使用defaultdict 为了澄清这个问题,下面是我试图实现的Python代码: from collections import defaultdict prices=defaultdict(lambda:5) # default value 5 instead of 0 prices[2]=0 prices[3]=0 print(prices) # {2: 0, 3: 0}

我读到Go将值设置为地图中数据类型的“零值”。我想知道是否有一种简单的方法可以设置不同的默认值,类似于在Python中使用defaultdict

为了澄清这个问题,下面是我试图实现的Python代码:

from collections import defaultdict
prices=defaultdict(lambda:5) # default value 5 instead of 0
prices[2]=0
prices[3]=0
print(prices) # {2: 0, 3: 0}
for i,p in enumerate ([0,1,2,3,4,5,6]):
    if p>prices[i]: 
    # if price is greater than existing price, compare to 5 when it doesn't exist 
        prices[i]=p
print(prices) # {0: 5, 1: 5, 2: 2, 3: 3, 4: 5, 5: 5, 6: 6})

您不能更改零值,但一种简单的模拟方法是将元素访问封装到一个函数中,如果找不到键,该函数可以返回您想要的任何内容:

var m = map[int]string{
    1: "one",
    2: "two",
}

func get(key int) string {
    if v, ok := m[key]; ok {
        return v
    }
    return "<missing>"
}
输出(在上尝试):

然后使用它:

m := mymap{
    m: map[int]string{
        1: "one",
        2: "two",
    },
    def: "<missing>",
}

fmt.Println(m.get(1))
fmt.Println(m.get(2))
fmt.Println(m.get(3))
m:=mymap{
m:map[int]字符串{
1:"一",,
二:"两个",,
},
定义:“,
}
fmt.Println(m.get(1))
fmt.Println(m.get(2))
fmt.Println(m.get(3))

输出是相同的。请在上尝试此选项。

No…………无法更改默认值,这会使代码更具可预测性。@BurakSerdar“更具可预测性”无疑是一个夸张的说法。一般来说,Go中完全没有魔术、自定义或覆盖默认行为。如果某些东西在Go中有一些默认行为,通常不值得探索改变它的方法,因为根本没有。
one
two
<missing>
type mymap struct {
    m   map[int]string
    def string
}

func (m mymap) get(key int) string {
    if v, ok := m.m[key]; ok {
        return v
    }
    return m.def
}
m := mymap{
    m: map[int]string{
        1: "one",
        2: "two",
    },
    def: "<missing>",
}

fmt.Println(m.get(1))
fmt.Println(m.get(2))
fmt.Println(m.get(3))