目录

go-map的声明和使用

go map的声明和使用

1.简介

map是key-value数据结构,右丞为字段或者关联数据。类似其他语言的集合,map在go中是引用类型,必须初始化才能使用。

2.语法

map[keytype]valuetype

keytype:表示间的类型。可以是基本数据类型,还可以是指针、channl等。注意slice、map还有function是可用的,没办法用==来判断。常用 string ,int。

valuetype:表示key对应的值。

3.map的初始化

3.1方式一

在使用前,需要先make,make的作用就是给map分配数据空间

    var dog map[string]string
	dog = make(map[string]string)
	dog["color"] = "red"
	dog["name"] = "dahuang"
	fmt.Println(dog)

结果:

map[color:red name:dahuang]

3.2方式二

    userinfo := make(map[string]string)
	userinfo["name"] = "zhansan"
	userinfo["height"] = "1.98"
	fmt.Println(userinfo)

结果:

map[height:1.98 name:zhansan]

3.3方式三

在声明的时候直接填充数据

	person := map[string]string{
		"name":   "松江",
		"height": "1.89",
	}
	fmt.Println(person)

结果:

map[height:1.89 name:松江]

4.map的增删改查

4.1map的增加

    var dog map[string]string
	dog = make(map[string]string)
	dog["color"] = "red"
	dog["name"] = "dahuang"

4.2map的查找

var dog map[string]string
	dog = make(map[string]string)
	dog["color"] = "red"
	dog["name"] = "dahuang"
	fmt.Println(dog["color"])
	value, ok := dog["name1"]
	if ok {
		fmt.Println(value)
	} else {
		fmt.Println("不存在")
	}

说明:如果dog这个map存在name1,那么ok就等于true,否则返回false。

结果:

red
不存在

4.3map的修改

var dog map[string]string
	dog = make(map[string]string)
	dog["color"] = "red"
	dog["name"] = "dahuang"
	dog["color"] = "pink"
	fmt.Println(dog["color"])

说明  :dog[“color”] = “pink” //如果有color这个key,就修改,没有就增加。

结果:

pink

4.4.map的删除

    var dog map[string]string
	dog = make(map[string]string)
	dog["color"] = "red"
	dog["name"] = "dahuang"
	delete(dog, "color")
	fmt.Println(dog)

说明:delete(dog, “color”),delete是一个内置函数,如果key存在,就删除该key-value,如果不存在,不操作,也不会报错。

如果要删除map的所有key,没有一个专门的方法一次删除,可以遍历删除,或者map=make()一个新的,让原来的成为垃圾,被gc回收。

结果:

map[name:dahuang]

5.map的遍历

person := map[string]string{
		"name1": "松江",
		"name2": "武松",
	}

结果:

key:name1  value:松江
key:name2  value:武松

6.map切片的使用

var listUser = make([]map[string]string, 2, 2)
	listUser[0] = make(map[string]string)
	listUser[0]["no"] = "1"
	listUser[0]["name"] = "zhangsan"
	listUser[1] = make(map[string]string)
	listUser[1]["no"] = "2"
	listUser[1]["name"] = "wangwu"
	fmt.Println(listUser)
	for _, value := range listUser {
		for key, mvalue := range value {
			fmt.Println(key, mvalue)
		}
	}

结果:

no 1
name zhangsan
no 2
name wangwu

7.使用细节

7.1map是引用类型,遵守引用类型传递的机制,在一个函数接受map,修改后,会直接修改原来的map。

7.2map的荣狼打倒后,在想map增加元素,会自动扩容,并不会发生panic,也就是说map能动态增长。

7.3map的value也常用struct类型,更适合管理复杂的数据。

8.练习提

计算字符串abcdergabchsdjfhfshkfh中各个字幕出现的次数。

var str = "abcdergabchsdjfhfshkfh"
	slice := []byte(str) //转成切片,再用string(slice[i])转换成字母
	maptotal := make(map[string]int)
	for _, value := range slice {
		_, ok := maptotal[string(value)]
		if ok {
			maptotal[string(value)] = maptotal[string(value)] + 1
		} else {
			maptotal[string(value)] = 1
		}
	}
	fmt.Println(maptotal)

结果:

map[a:2 b:2 c:2 d:2 e:1 f:3 g:1 h:4 j:1 k:1 r:1 s:2]