您现在的位置是:首页 > 正文

Go基础-Maps

2024-02-01 02:48:33阅读 1

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("不相等")
	}
}

网站文章