文章目录
1 定义
map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。
2 赋值&初始化
map 的零值是 nil。如果你想添加元素到 nil map 中,会触发运行时 panic。因此 map 必须使用 make 函数初始化。
make初始化map的函数原型
创建一个变量名为name,键为string,值为double的map
name := make(map[string]double)
2.1 先定义,在初始化
package main
import "fmt"
func main() {
var a map[string]float64
if a == nil {
a = make(map[string]float64)
}
a["张三"] = 12000.0
a["李四"] = 12500.0
fmt.Println(a)
}
1 先定义一个变量
var a map[string]float64
2 使用make进行初始化
a = make(map[string]float64)
3 赋值
a[“张三”] = 12000.0
2.2 直接使用make创建变量并初始化
package main
import "fmt"
func main() {
a := make(map[string]float64)
a["张三"] = 12000.0
a["李四"] = 12500.0
fmt.Println(a)
}
代码简化后,和上面的输出是一样的。
2.3 在声明时进行初始化
package main
import "fmt"
func main() {
a := map[string]float64{
"张三": 12000.0,
"李四": 12500.0,
}
fmt.Println(a)
}
这种声明和初始化的方式更加方便。
3 map的增删改查
3.1 增加
新增数据前面已经提到,直接使用 name[“key”] = value 操作之后在name这个map中添加了以key为键值为value的一对键值对。
3.2 查询
获取map中有的键
package main
import "fmt"
func main() {
players := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
// 获取存在的键
v, ok := players["洛杉矶湖人"]
fmt.Println(v, ok)
// 获取不存在的键
v2, ok2 := players["洛杉矶快船"]
fmt.Println(v2, ok2)
}
返回值:
科比 true
false
从上面的返回值结果可以发现,对于不存在的键,会返回值类型(本例string)的默认值(string空值为空字符串),其实也可以通过判断ok的值,来决定输出什么。
获取map中没有的键
//对于没有的键可以返回默认值,也可以自己想返回什么就设置什么
package main
import "fmt"
func main() {
players := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
// 获取存在的键
v, ok := players["洛杉矶湖人"]
fmt.Println(v, ok)
// 获取不存在的键
v2, ok2 := players["洛杉矶快船"]
if !ok2 {
v2 = "查找的key不在次map中"
}
fmt.Println(v2)
}
遍历整个map 注意,每次遍历map输出的顺序可能不相同
package main
import "fmt"
func main() {
players := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
for k, v := range players {
fmt.Printf("[球队]:%s--->[当家球星]:%s\n", k, v)
}
}
[球队]:洛杉矶湖人--->[当家球星]:科比
[球队]:休斯顿火箭--->[当家球星]:姚明
[球队]:金州勇士--->[当家球星]:库里
[球队]:波士顿凯尔特人--->[当家球星]:雷阿伦
[球队]:底特律活塞--->[当家球星]:汉密尔顿
[球队]:菲尼克斯太阳--->[当家球星]:布克
3.3 删除
package main
import "fmt"
func main() {
players := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
fmt.Println(players)
delete(players, "洛杉矶湖人")
fmt.Println(players)
delete(players, "洛杉矶快船")
fmt.Println(players)
}
delete函数没有返回值!删除不存在的键直接就返回。
3.4 修改
修改和赋值是一样的语法。
package main
import "fmt"
func main() {
players := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
players["洛杉矶湖人"] = "詹姆斯"
fmt.Println(players["洛杉矶湖人"])
}
4 map是引用类型
map和slice一样,也是引用类型,对map的修改也会影响其他共享该实际地址的值。
package main
import "fmt"
func changeTest(m map[string]string) {
m["洛杉矶湖人"] = "詹姆斯"
m["金州勇士"] = "大嘴格林"
}
func printMap(m map[string]string) {
for k, v := range m {
fmt.Printf("[球队]:%s--->[当家球星]:%s\n", k, v)
}
}
func main() {
players := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
printMap(players)
fmt.Println("_____________________________________________________")
changeTest(players)
fmt.Println("_____________________________________________________")
printMap(players)
}
输出结果:
[球队]:洛杉矶湖人--->[当家球星]:科比
[球队]:休斯顿火箭--->[当家球星]:姚明
[球队]:金州勇士--->[当家球星]:库里
[球队]:波士顿凯尔特人--->[当家球星]:雷阿伦
[球队]:底特律活塞--->[当家球星]:汉密尔顿
[球队]:菲尼克斯太阳--->[当家球星]:布克
_____________________________________________________
_____________________________________________________
[球队]:洛杉矶湖人--->[当家球星]:詹姆斯
[球队]:休斯顿火箭--->[当家球星]:姚明
[球队]:金州勇士--->[当家球星]:大嘴格林
[球队]:波士顿凯尔特人--->[当家球星]:雷阿伦
[球队]:底特律活塞--->[当家球星]:汉密尔顿
[球队]:菲尼克斯太阳--->[当家球星]:布克
5 map的比较
package main
import "fmt"
func main() {
players := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
players2 := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
if players == players2 {
fmt.Println("相同")
} else {
fmt.Println("不相同")
}
}
直接编译就报错了:
invalid operation: players == players2 (map can only be compared to nil)
go的错误提醒真的很清晰,map只能和其零值nil做比较,不能和其他值做比较。
想要比较map必须一项一项的对比才行:
package main
import "fmt"
func main() {
players := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
players2 := map[string]string{
"洛杉矶湖人": "科比",
"休斯顿火箭": "姚明",
"金州勇士": "库里",
"波士顿凯尔特人": "雷阿伦",
"底特律活塞": "汉密尔顿",
"菲尼克斯太阳": "布克",
}
t := false
for k, v := range players {
if v != players2[k] {
t = true
break
}
}
if !t {
fmt.Println("相等")
} else {
fmt.Println("不相等")
}
}