有时候可能需要知道对应的元素是否在map中,例如,如果元素类型是一个布尔类型,你可能需要区分一个零值的元素,和因为元素不存在而返回的零值,可以像下面这样使用:
v,ok:=map[key]
if !ok{/*在map中不存在key为键的元素*/}
//结合起来使用
if v,ok:=map[key];!ok{/* */ }
在这种场景下,map下标语法将产生两个值;第二个值是一个布尔类型,用于表示元素是否存在。布尔变量一般命名为ok。示例如下:
myMap3 := map[string]int{"str1": 10, "str2": 20, "str3": 30}
if v, ok := myMap3["str2"]; ok {
fmt.Println(v)
}
5 遍历映射
遍历map使用range风格的for循环实现。由于map是无序的集合,所以每次遍历的顺序可能不一样。
myMap3 := map[string]int{"str1": 10, "str2": 20, "str3": 30}
for k, v := range myMap3 {
fmt.Println(k, v)
}
6 映射不可比较
和slice一样,map之前也不能进行相等比较;唯一的例外是和nil进行比较。要判断两个map是否包含相同的key和value,我们必须通过一个循环实现。有时候,我们需要一个map的key是slice类型,但是map的key必须是可比较的类型,但是slice并不满足这个条件。我们可以通过两个步骤绕过这个限制。第一步,定义一个辅助函数k,将slice转为map对应的string类型的key,确保只有x和y相等时,k(x)==k(y)才成立。然后创建一个key为string类型的map,在每次对map操作时,先用k辅助函数将slice转化为string类型。
7 不能对映射元素取址操作