go map 是一种无序的键值对集合,今天复习一下map结构及其操作,扎实下基础。
江山如此多娇,引无数英雄竞折腰。
目录
map元素查看、遍历与删除
// 初始化一个string值的map并赋值
m := map[string]string{}
m["a"] = "value-a" //新增值
m["b"] = "value-b"
fmt.Println(m) // map[a:value-a b:value-b]
// 查看m里有没有a元素及其值,存在该键值对时exist为true,反之为false
if v, exist := m["a"];exist {
fmt.Println("键值存在:", v) // 键值存在: value-a
} else {
fmt.Println("key为a的元素不存在。")
}
// 遍历m:以两个值获取
for key, value := range m {
fmt.Printf("m[%s] = %s \t", key, value) // m[a] = value-a m[b] = value-b
}
fmt.Println("")
// 遍历m:以第二个参数获取,只获取值
for _, value := range m {
fmt.Printf("每个元素的值= %s \t", value) // 每个元素的值= value-a 每个元素的值= value-b
}
fmt.Println("")
// 遍历m:以第一个参数获取
for key, _ := range m {
fmt.Printf("%s = %s \t", key, m[key]) // b = value-b a = value-a
}
// 删除key为b的元素
delete(m, "b")
fmt.Println(m) //map[a:value-a]
map元素修改(元素value类型为string、int)
// 初始化一个int值的map并赋值
m2 := map[string]int{}
m2["A"] = 1
m2["B"] = 2
fmt.Println(m2) // map[A:1 B:2]
m2["A"] = 3
fmt.Println(m2) // map[A:3 B:2]
// 初始化一个string值的map并赋值
m3 := map[string]string{}
m3["a"] = ""
m3["b"] = "b"
fmt.Println(m3) // map[a: b:b]
m3["a"] = "a"
fmt.Println(m3) // map[a:a b:b]
map元素修改(元素value类型为struct{})
type data struct {
name string
gender string
}
// 初始化一个struct值的map并赋值
m := map[string]data{"x": {"value1", "F"}}
// 当key不存在map中的时候为新增,当key存在于map的时候为修改,覆盖旧值
m["y"] = data{"value2", "M"} // 增加新键值对
m["z"] = data{"value3", "M"} // 增加新键值对
fmt.Println(m) // map[x:{value1 F} y:{value2 M}]
// 注意,map元素是无法取址的,不可以m["x"].name来直接修改
//m["x"].name = "new" //cannot assign to struct field m["x"].name in map
怎样修改?有以下几种方式
// 1,修改key为y的值,只修改gender字段
m["y"] = data{gender: "F"} // map[x:{value1} y:{new value}]
// 修改key为z的name,构造新结构体赋值
m["z"] = data{name: "z's name", gender: "F"}
fmt.Println(m) // map[x:{value1 F} y:{ F} z:{z's name F}]
// 2,将map的value设为指针类型(结构体较大时最优)
mm := map[string] *data{}
mm["a"] = &data{gender:"F",name:"name"}
fmt.Println(mm["a"]) // &{name F}
// 修改name字段为name1
mm["a"].name = "name1"
fmt.Println(mm["a"]) // &{name1 F}
// 注意下面一行操作,key为new的元素不存在,此时mm["new"]是空引用,不能.name
mm["new"].name = "new" // panic: runtime error: invalid memory address or nil pointer dereference
// 可以这样来
mm["new"] = &data{name:"new",gender:"new"}
for key, value := range mm {fmt.Printf("m[%s] = %s \t", key, value)} //m[a] = &{name1 F} m[new] = &{new new}
// 3,以第三方变量的方式,如想修改key为x的元素值,原元素为"x": {"value1", "F"},修改F为M
data := m["x"]
data.gender = "M"
m["x"] = data
fmt.Println(m) // map[x:{value1 M} y:{ F} z:{z's name F}]
k-v互换操作
m := make(map[string]int)
m["a"] = 0
m["b"] = 1
fmt.Println("互换前:", m) // 互换前: map[a:0 b:1]
// k-v互换
m2 := make(map[int]string)
for key, value := range m {
m2[value] = key
}
fmt.Println("互换后:", m2) // 互换后: map[0:a 1:b]
来源:CSDN
作者:_雨落山岚
链接:https://blog.csdn.net/HYZX_9987/article/details/103733450