Go语言Map(9)| Go主题月

308 阅读2分钟

今天来说说Go语言的第三种集合类型,Map(映射),一个无序的 K-V 键值对集合,Key的数据类型必须相同,Value也一样,但是Key的数据类型和Value的数据类型可以不一样,看看如何初始化Map,添加数据

func main() {
    dict1 := make(map[int]string)  //使用make定义一个空映射,value类型为string,key类型为int
    fmt.Println(dict1)  //map[]
    dict1[0] = "hello"
    dict1[1] = "world"
    fmt.Println(dict1)	//map[0:hello 1:world]
}

删除键值

如果要删除其中一个键值对,那么就要用delete方法,还是拿上面的dict例子:

delete(dict1,0)
fmt.Println(dict1)	//map[1:world]

Go 语言的map 可以获取不存在的键值对,如果键不存在,会返回该map的类型的零值。
零值补充知识:
如果map的value类型为string,获取map不存在的键值对的时候会返回为" " 依次类推bool类型零值为 false
int类型零值为 0
float类型零值为 0.0

image.png

[]第二个参数

map使用[]一般用来获取键对应的值,只有一个值,其实还可以获取两个值,第二值是bool类型,判断这个键值是不是存在。来举个例子:

    myvalue1,status1:=dict1[1]  //在上面dict1为:map[1:world]
    if status1 {
        fmt.Println("键值:"+myvalue1) //键值:world
    }
    _,status2:=dict1[0]
    if !status2 {
        fmt.Println(status2)  //false
    }

image.png

遍历map

来使用for 循环来遍历下map:

    dict3 := map[string]int{"hello":0,"word":1,"go":2}
    for key,val := range dict3{
        fmt.Println(key,val)  //hello 0   word 1   go 2
    }

map没有容量,只有长度,也就是键值对的个数,也是用内置方法len计算:

fmt.Println(len(dict3))   //3

image.png

补充知识(凑字数)

我看这个map跟json挺像,试试转字符串:

package main
import (
	"fmt"
	"encoding/json"  //处理json的包
)

func main() {
	dict3 := map[string]int{"hello":0,"word":1,"go":2}  //定义一个map
	str, err := json.Marshal(dict3)  //json转成[]byte类型:[123 34 103 111 34 58 50 44 34 104 101 108 108 111 34 58 48 44 34 119 111 114 100 34 58 49 125]   ,跟易语言挺像,哈哈
	if err !=nil{
		fmt.Println("转换失败")
	}else{
		fmt.Printf("%c",str)  //格式化字符串输出 :[{ " g o " : 2 , " h e l l o " : 0 , " w o r d " : 1 }]
	}
}

继续补充Go格式化输出%后面各种字母的意思,(必须搭配fmt.Printf使用,不是fmt.Println): printf("%c",a);输出单个字符。
printf("%d",a);输出十进制整数。
printf("%f",a);输出十进制浮点数。 printf("%o",a);输出八进制数。
printf("%s",a);输出字符串。
printf("%u",a);输出无符号十进制数。
printf("%x",a);输出十六进制数。

image.png

总结

map键值对是无序的,Go语言的map是hash结构的,平均访问时间复杂度是O(1)的,所以通过键取值效率非常高,每次都要提到效率,对的,提升Go的效率就要从细节说起啊。