Go学习笔记—map、range
感谢观看,如有问题,请留言指正!谢谢
1、map
map是Go内置的关联数据类型,也可称为字典或者哈希,内部由散列表(hash)
实现
map是一种无序的基于key-value
的数据结构,需要使用内置的make()
函数创建,其语法为:
//make(map[key-type]value-type)
make(map[string]int)
//Map: An empty map is allocated with enough space to hold the
//specified number of elements. The size may be omitted, in which case
//a small starting size is allocated.
//一个空map被分配足够的空间来存储指定数量的元素。空间的容量可以省略,在这种情况下,分配较小的其实空间。
map的初始化和基本使用:
func main(){
m := make(map[string]int)
m["安徽"] = 10
m["江苏"] = 13
fmt.Println("map:",m)
//使用自动推导声明和初始化键值对
n := map[int]int{
1:10,2:100,3:1000}
fmt.Println("map-n:",n)
}
//map: map[安徽:10 江苏:13]
//map-n: map[1:10 2:100 3:1000]
使用name[key]
来获取键对应的值:
func main(){
v1 := m["安徽"]
fmt.Println(v1)
}
//10
使用内置函数len()
,可以获取键值对数目:
func main(){
fmt.Printf("包含键值对的数目为:%d",len(m))
}
//包含键值对的数目为:2
使用内置函数delete()
,可以从map中移除键值对
func main(){
delete(m,"江苏")
fmt.Println("map:",m)
}
map: map[安徽:10]
当从map中获取值时,可以使用value:ok := map[key]
来判断键对应的值是否在map中。可以消除键不存在和键有零值,例如0
和""
而产生的歧义
func main(){
_,prs := m["江苏"]
fmt.Println("prs:",prs)
}
//prs: false 说明不存在指定的键
2.range
遍历
range
一般与for
组合使用,可以提供每个项的索引和值。
在**slice
**中,除了使用索引遍历,可以使用for...range...
来遍历。
func main(){
slice := []int{
1,2,3,4,5,6,7,8,9,0}
sum := 0 //返回切片存储值的和
ind := 0 //返回切片存储元素的个数
for index,value := range slice{
ind += 1
sum += value
fmt.Printf("%d:%d\t",index,value)
}
fmt.Printf("\n")
fmt.Printf("存储元素的个数为:%d\t",ind)
fmt.Printf("存储元素的总和为:%d\t",sum)
}
//0:1 1:2 2:3 3:4 4:5 5:6 6:7 7:8 8:9 9:0
//存储元素的个数为:10 存储元素的总和为:45
通过上述的输出结果可以看出,for...range...
遍历的结果,可以同时输出元素对应的索引,如果不需要索引值,可以使用匿名变量_
for index,value := range slice //使用索引值
for _,value := range slice //不需要使用索引值
在**array
**中,使用方法与slice
类似。
在**map
**中,使用方法类似。
func main(){
kvs := map[string]string{
"a":"apple","b":"banana"}
for key,value := range kvs{
fmt.Printf("%s:%s\n",key,value)
}
}
//a:apple
//b:banana
在**string
**中,第一个返回值是字符的起始字节位置,第二个返回值是字符自己。
func main(){
for i,c := range "study"{
fmt.Println(i,c)
}
}
//0 115
//1 116
//2 117
//3 100
//4 121
for...range...
还可以在通道(channel
)中使用只返回通道内的值。