今天来说说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
[]第二个参数
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
}
遍历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
补充知识(凑字数)
我看这个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);输出十六进制数。
总结
map键值对是无序的,Go语言的map是hash结构的,平均访问时间复杂度是O(1)的,所以通过键取值效率非常高,每次都要提到效率,对的,提升Go的效率就要从细节说起啊。