Go学习笔记—map字典和for-range遍历

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)中使用只返回通道内的值。

猜你喜欢

转载自blog.csdn.net/weixin_46435420/article/details/119449731