定义

先骂一句
fucking you 🐛🏊
得到消息好像又可以了,那就不fuck了
大概三种方式定义

func main() {
	m1 := map[string]string{
		"name": "wh",
		"city": "sgp",
	} //map[city:sgp name:wh]

	m2 := make(map[string]int) //map[]

	var m3 map[string]int  //map[]

	fmt.Println(m1, m2, m3)
}

遍历

func main() {
	m1 := map[string]string{
		"name": "wh",
		"city": "sgp",
	} //map[city:sgp name:wh]

	for k, v := range m1 {
		fmt.Println(k, v)

	}
	
}

得到结果

name wh
city sgp

⚠️ key在map里面无序,也就是输出还可以下面这样,如果需要排序就需要手动对key排序(slice),然后也可以这样(slice的len)来获取元素个数。

city sgp
name wh

如果不需要的参数 k,v 可以_替代

获取map的值

func main() {
	m1 := map[string]string{
		"name": "wh",
		"city": "sgp",
	} //map[city:sgp name:wh]
	fmt.Println(m1["name"])  //wh
}

m1["name"] 这样
如果打错了 m1["nama"] 会输出 空的

判断值是否存在

func main() {
	m1 := map[string]string{
		"name": "wh",
		"city": "sgp",
	} //map[city:sgp name:wh]
	
	_, nameok := m1["name"]
	fmt.Println(nameok) //true

	_, namaok := m1["nama"]
	fmt.Println(namaok)  //false

}

类似 _, nameok := m1["name"] 其中_的位置表示取得的值(这里_表示我不要),nameok表示name段是否存在

实际可以这么用嘛

m1 := map[string]string{
		"name": "wh",
		"city": "sgp",
	} //map[city:sgp name:wh]

	if name,ok := m1["name"];ok{
		fmt.Println(name)
	}else {
		fmt.Println("空值")
	}

有值就打印,没有就打印“空值”

删除值

func main() {
	m1 := map[string]string{
		"name": "wh",
		"city": "sgp",
	} //map[city:sgp name:wh]

	fmt.Println(m1) //map[city:sgp name:wh]
	delete(m1, "name")
	fmt.Println(m1) //map[city:sgp]
}

就是 delete(m1, "name")
delete 第一个参数是 map名 第二个是 字段名

map的key

map使用哈希表,可以比较相等
除了slice,map,function的内建类型都可以作为key(通常也不会这样乱搞)
struct类型不包含上述字段也可以作为key