map做函数参数
与slice 相似,在函数间传递映射并不会制造出该映射的一个副本,不是值传递,而是引用传递:
func DeleteMap(m map[int]string, key int) {
delete(m, key) //删除key值为2的map
for k, v := range m {
fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
}
//len(m)=2, 1 ----> Luffy
//len(m)=2, 3 ----> Zoro
}
func main() {
m := map[int]string{1: "Luffy", 2: "Sanji", 3: "Zoro"}
DeleteMap(m, 2) //删除key值为2的map
for k, v := range m {
fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
}
//len(m)=2, 1 ----> Luffy
//len(m)=2, 3 ----> Zoro
}
map做函数返回值
返回的依然是引用:
func test() map[int]string {
// m1 := map[int]string{1: "Luffy", 2: "Sanji", 3: "Zoro"}
m1 := make(map[int]string, 1) // 创建一个初创容量为1的map
m1[1] = "Luffy"
m1[2] = "Sanji" // 自动扩容
m1[67] = "Zoro"
m1[2] = "Nami" // 覆盖 key值为2 的map
fmt.Println("m1 = ", m1)
return m1
}
func main() {
m2 := test() // 返回值 —— 传引用
fmt.Println("m2 = ", m2)
}
输出:
m1 = map[1:Luffy 2:Nami 67:Zoro]
m2 = map[2:Nami 67:Zoro 1:Luffy]
练习3: 封装 wcFunc() 函数。接收一段英文字符串str。返回一个map,记录str中每个“词”出现次数的。
如:"I love my work and I love my family too"
输出:
family : 1
too : 1
I : 2
love : 2
my : 2
work : 1
and : 1
提示:使用 strings.Fields() 函数可提高效率。