Go教程映射

Posted 玖五二七

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go教程映射相关的知识,希望对你有一定的参考价值。

映射是通过键值访问的一个集合.一个映射通过来访问它存储的.是一个简单的从映射中找出的方式.就像是书前面的索引一样.可以看作是的索引

相对于数组和切片只能用整数作为索引不同,映射可以作用任何可以使用==操作符的类型作为,如数字,字符串等等,所有的类型必须相同,所有的也必须是同一类型.但是不必是相同的类型.比如是字符串,是浮点数

声明映射的代码如下

var 变量名 map[key_type]value_type

这里的var 和map都是go中的保留关键字.

// 先声明后创建
var map0 map[string]int
map0 = make(map[string]int)  // 创建后才能使用
fmt.Printf("map0 %#v \\n", map0)
// 给映射赋值
map0["1"] = 1  // "1": 1
map0["hello"] = 2 // "hello": 2

映射字面量初始化

和切片与数组一样,映射也可以使用字面量来初始化,也是用来进行初始化

// 映射字面量
map2 := map[string]int"1": 1, "2": 2
fmt.Printf("map2 %#v \\n", map2)
// map2 map[string]int"1":1, "2":2

映射中的零值

与数组和切片一样,对于没有赋值过的键,会得到一个零值.

// 映射的零值
fmt.Printf("map2[3] = %d", map2["3"]) // 0

映射的零值取决于不同的类型,可能不是0,比如字符串就是空字符.

// 字符串零值
map3 := make(map[string]string)
fmt.Printf("map3[h] = %s\\n", map3["h"]) // 输出为空字符串

映射声明的nil值

// 先声明后创建
var map0 map[string]int
//panic: assignment to entry in nil map
// map0["1"] = 1
map0 = make(map[string]int) // 必须先make才能赋值
map0["1"] = 1

如何区分已赋值还是原始零值

零值虽然有用,但是会产生一个问题,就是不知道这个值是原始0值还是被赋值的.试想一下有个映射里面保存每个同学的成绩,张三得了0分,那么,这个0分是真正的0分还是因为忘了录入造成的就不得而知了.

为了解决这个问题,获取映射键的时候可以选择取出第2个布尔类型的变量的值.这个值如果是true,表示该键已经赋过值了,如果是false,则表示还没有被赋值.

// 字符串零值
map3 := make(map[string]string)
v, ok := map3["h"]
fmt.Printf("map3[h] = %s %#v\\n", v, ok) 
// map3[h] =  false

使用for…range来循环映射

与数组和切片一样,映射也支持for…range的循环来获取每一个键和值,代码如下所示

// for... range循环
  for k, v := range map2 
    fmt.Println("k = ", k, " v = ", v)
  

以上就是使用for range循环的代码

但是运行这段代码会发生一个现象,就是输出不是顺序的.这是正常的,因为映射在内存中的存储是无序的,和数组与切片的索引一定是有顺序的不同,映射是随机的.

如何顺序打印随机的映射

方法是对key先切片排序.然后按该切片进行打印输出

import (
  "fmt"
  "sort"
)

func main() 
  // 映射字面量
  map2 := map[string]int"1": 1, "2": 2, "3":3
  order := []string
  for k := range map2 
    order = append(order, k)
  
  sort.Strings(order)
  // for... range循环
  for _, v := range order 
    fmt.Println("k = ", v, " v = ", map2[v])
  

经过修改以后,代码每次输出顺序都一致了

用delete删除键

golang提供了delete函数来删除映射中的键

// 字符串零值
  map3 := make(map[string]string)
  v, ok := map3["h"]
  fmt.Printf("map3[h] = %s %#v\\n", v, ok) // ok = false
  map3["h"] = "5"
  v, ok = map3["h"]
  fmt.Printf("map3[h] = %s %#v\\n", v, ok) // ok = true
  delete(map3, "h")
  fmt.Printf("map3[h] = %s %#v\\n", v, ok) // ok = false,因为h被删除了

以上是关于Go教程映射的主要内容,如果未能解决你的问题,请参考以下文章

Go教程结构体

Go教程映射

Go教程映射

Go教程映射

go使用结构体时需要import吗

Go 类型