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() 函数可提高效率。