在Go中,让m
是将string
映射到int
的映射对象,假设"foo"
不是m
的键,则语句< / p>
m["foo"]
返回两个值0
和false
,其中false
暗示"foo"
不是m
的键。
您能给出一些例子,例如go的属性有用吗?
答案 0 :(得分:4)
在Go 1之前的某个时间,用不存在的键索引地图会导致应用程序崩溃。进行了更改,以返回映射的值类型的零值。这是一项设计决策,它允许(有限)使用未初始化的语言构造而无需额外检查,从而简化了代码。
例如,您可以在for range
切片和nil
上nil
,可以检查其长度等。结果当然是相同的:遍历nil
slice或map的迭代次数为零,nil
slice和map的长度为0,但是您无需事先使用if
语句来判断该值是否为非{{1 }}(以告诉您是否可以覆盖它们或对其进行索引)。
当不存在的键的零值非常有用时,PeterSO已经展示了一个很好的例子:计数器。
另一个著名的例子是将地图用作集合。如果将值类型选择为nil
,则不必初始化不在集合中的值。为地图建立索引会告诉您值(键)是否在集合中,如果不是,则bool
类型的零值为bool
会告诉您它不在集合中。
例如:
false
输出(在Go Playground上尝试):
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"])
答案 1 :(得分:2)
Go不会引发错误。 Go报告错误。
地图元素零值的常用用法:
package main
import (
"fmt"
)
func main() {
counts := map[string]int{}
fmt.Println(counts)
// Equivalent:
// counts["foo"] = counts["foo"] + 1
// counts["foo"] += 1
// counts["foo"]++
counts["foo"]++
fmt.Println(counts)
counts["foo"]++
fmt.Println(counts)
}
游乐场:https://play.golang.org/p/nvHBrgV_lFU
输出:
map[]
map[foo:1]
map[foo:2]
逗号的常用用法,可以使用表单映射索引表达式:
package main
import (
"fmt"
)
func main() {
m := map[string]map[string]int{}
fmt.Println(m)
// panic: assignment to entry in nil map
// m["K1"]["K2"]++
_, ok := m["K1"]
if !ok {
m["K1"] = map[string]int{}
}
m["K1"]["K2"]++
fmt.Println(m)
m["K1"]["K2"]++
fmt.Println(m)
}
游乐场:https://play.golang.org/p/9byxSSIWBre
输出:
map[]
map[K1:map[K2:1]]
map[K1:map[K2:2]]