第四章 go语言 数组、切片和映射 (10)

有时候可能需要知道对应的元素是否在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是否包含相同的keyvalue,我们必须通过一个循环实现。有时候,我们需要一个mapkeyslice类型,但是mapkey必须是可比较的类型,但是slice并不满足这个条件。我们可以通过两个步骤绕过这个限制。第一步,定义一个辅助函数k,将slice转为map对应的string类型的key,确保只有xy相等时,k(x)==k(y)才成立。然后创建一个keystring类型的map,在每次对map操作时,先用k辅助函数将slice转化为string类型。

7 不能对映射元素取址操作

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxdzw.html