在 Go 中,让我们m映射映射string到 的对象int,假设"foo"不是 的键m,那么语句
m["foo"]
Run Code Online (Sandbox Code Playgroud)
返回两个值0,false这false意味着"foo"不是 的键m。你能举一些情况,举例说明 go 的属性有用吗?
在 Go 1 使用不存在的键索引地图之前,有一段时间会导致应用程序崩溃。这已更改为返回地图值类型的零值。这是一个设计决策,它允许(有限地)使用未初始化的语言结构而无需额外检查,从而简化了代码。
例如你可以for range遍历nil切片和nil映射,你可以检查它们的长度等。结果当然是一样的:迭代nil切片或映射将导致零次迭代,nil切片和映射的长度为 0,但你没有需要if事先使用语句来判断该值是否为非nil(以判断您是否可以对它们进行范围覆盖或索引它们)。
当不存在的键的零值很有用时,PeterSO 已经展示了一个很好的例子:计数器。
另一个著名的例子是将地图用作集合。如果选择值类型为bool,则不必初始化不在集合中的值。索引映射会告诉您一个值(键)是否在集合中,如果不是,则bool类型being的零值false将告诉您它不在集合中。
例如:
fruits := map[string]bool{}
// Add elements to the set:
fruits["apple"] = true
fruits["banana"] = true
// Test if elements are in the map:
fmt.Println("Is apple in the set?", fruits["apple"])
fmt.Println("Is banana in the set?", fruits["banana"])
fmt.Println("Is plum in the set?", fruits["plum"])
fmt.Println("Is lemon in the set?", fruits["lemon"])
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
Is apple in the set? true
Is banana in the set? true
Is plum in the set? false
Is lemon in the set? false
Run Code Online (Sandbox Code Playgroud)