<8>Golang基础进阶——Map

Golang基础进阶——Map

映射(map)一一建立事物关联的容器

Map 是go内置的数据结构,是一种无序的键值对的集合,可以通过key快速找到,Map必须初始化才能使用,否则报错。

map 的定义:

var 变量名 map[KeyType]ValueType

示例1:

func main() {
      var m1 map[int]string
      fmt.Println(m1 == nil) // true
      fmt.Println(m1)        // map[]

      m2 := map[int]string{}
      m3 := make(map[int]string)
      fmt.Println(m2, m3) // map[] map[]
      fmt.Println(m2[1])  // 字符串默认为空

      m4 := make(map[int]string, 10)
      m4[1] = "wsl"
      fmt.Println(m4[1])
      fmt.Println(len(m4))

      var m5 = map[int]string{1: "啥", 2: "啊"}
      fmt.Println(m5)

      m6 := map[int]string{1: "啊", 2: "大"}
      fmt.Println(m6)
}

 示例2:

func main() {
m1 := map[int]string{1: "zs", 2: "ls"}
      m1[1] = "ww"
      m1[3] = "ss"
      fmt.Println(m1) // map[1:ww 2:ls 3:ss]

      m2 := make(map[int]string, 8)
      m2[0] = "aaa"
      m2[1] = "bbb"
      fmt.Println(m2[0]) // aaa
}

 map的遍历、遍历、查找

func main() {
      m1 := map[int]string{1: "ww", 2: "ls"}
      m1[1] = "www"
      m1[3] = "ss"

      for k, v := range m1 {
            fmt.Println(k, v)
      }

      value, ok := m1[5]
      fmt.Println("value=", value, "ok=", ok)

      // 删除key
      delete(m1, 1)
      fmt.Println(m1)
}

 map的排序

func main() {
      rand.Seed(time.Now().UnixNano())
      var a = make(map[string]int, 10)
      for i := 0; i < 10; i++ {
            key := fmt.Sprintf("stu%d", i)
            value := rand.Intn(1000)
            a[key] = value
      }

      var keys = make([]string, 0, 10)
      for key := range a {
            keys = append(keys, key)
      }
      sort.Strings(keys)
      for _, v := range keys {
            fmt.Println(v, a[v])
      }
}

map引用类型示例:

func modify(a map[int]string) {
      a[1003] = "by"
}

func main() {
      var a map[int]string
      a = make(map[int]string, 10)
      // 声明之后不能直接使用,必须使用make初始化
      a[1001] = "stu1"
      a[1002] = "stu1"
      a[1003] = "stu1"

      b := a
      b[1003] = "wsl"
      fmt.Println(a) // map[1001:stu1 1002:stu1 1003:wsl]

      modify(a)
      fmt.Println(a) // map[1001:stu1 1002:stu1 1003:by]
}

map类型的切片

func main() {
      var s []map[int]string

      s = make([]map[int]string, 5, 10)
      for i, v := range s {
            fmt.Println(i, v)
      }

      s[0] = make(map[int]string, 10)
      s[0][1001] = "wsl1"
      s[0][1002] = "wsl2"
      s[0][1003] = "wsl3"
      for i, v := range s[0] {
            fmt.Println(i, v)
      }
}

值为切片类型的map

func main() {
      var s map[int][]string
      s = make(map[int][]string, 10)

      key := 1000

      value, ok := s[key]
      if !ok {
            s[key] = make([]string, 0, 10)
            value = s[key]
      }

      value = append(value, "stu1")
      value = append(value, "stu2")

      s[key] = value
      fmt.Println(s) // map[1000:[stu1 stu2]]
}

清空map中的所有元素

有意思的是, Go 语言中并没有为 map 提供任何清空所有元素的函数、方法。清空 map 的唯一办法就是重新 make 一个新的 map 。不用担心垃圾回收的效率 Go 语言中的并行垃
圾回收效率比写一个清空函数高效多了。

小练习:

写一个程序,统计一个字符串每个单词出现的次数,例如统计s=”hello ni hao hello hello”,输出hello=3 ni=1 hao=1

func WordCount(str string) map[string]int {
   words := strings.Split(str, " ")
   // 返回的map
   var result map[string]int = make(map[string]int, 16)
   for _, v := range words {
      // 看结果里 ,有没有
      count, ok := result[v]
      if !ok {
         result[v] = 1
      } else {
         result[v] = count + 1
      }
   }
   return result
}

func main() {
   var str = "hello ni hao hello hello"
   res := WordCount(str)
   // 遍历
   for k, v := range res {
      fmt.Printf("%s=%d ", k, v)
   }
}

 

posted @ 2020-04-26 12:27  Wshile  阅读(220)  评论(0)    收藏  举报