本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
  • Map 是一种 无序的 键值对的集合。Map 最重要的一点是通过 key 来快速检索value。
  • key 类似于索引,指向数据的值, key必须可以使用==运算符来比较,不能重复。
  • Map 是使用 hash 表来实现的。
  • map自动扩容
  • var map 变量名 map[key_type]value_type

    func make(Type, size IntegerType) Type

    内建函数make分配并初始化一个类型为切片、映射、或通道的对象。其第一个实参为类型,而非值。make的返回类型与其参数相同,而非指向它的指针。其具体结果取决于具体的类型:

    映射:初始分配的创建取决于size,但产生的映射长度为0。size可以省略,这种情况下就会分配一个小的起始大小。

    map的键 必须 是可以通过操作符 == 来比较的数据类型。int、布尔、string、或包含前面的struct、数组等

    声明时直接make

    var 变量名 = make(map[key_type][value_type])

    // A header for a Go map.
    type hmap struct {
      // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.
      // Make sure this stays in sync with the compiler's definition.
      count     int // # live cells == size of map.  Must be first (used by len() builtin)
      flags     uint8
      B         uint8  // log_2 of # of buckets (can hold up to loadFactor * 2^B items)
      noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details
      hash0     uint32 // hash seed
      buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
      oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing
      nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated)
      extra *mapextra // optional fields
              
    // A bucket for a Go map.
    type bmap struct {
      // tophash generally contains the top byte of the hash value
      // for each key in this bucket. If tophash[0] < minTopHash,
      // tophash[0] is a bucket evacuation state instead.
      tophash [bucketCnt]uint8
      // Followed by bucketCnt keys and then bucketCnt elems.
      // NOTE: packing all the keys together and then all the elems together makes the
      // code a bit more complicated than alternating key/elem/key/elem/... but it allows
      // us to eliminate padding which would be needed for, e.g., map[int64]int8.
      // Followed by an overflow pointer.
      //----------声明并分配空间------
      var m1 = make(map[string]string,5)
      m2 := map[string]string{"野王":"赵云"}
      //---------添加和修改---------------
      m1["上官"] = "言为心声"
      m1["婉儿"] = "字为心画"
      m2["野王"] = "老虎"
      m2["上单"] = "吕布"
      fmt.Println("m m1 m2:",m,m1,m2)
      //----------删除-------------------
      delete(m1,"上官")
      fmt.Println("m1:",m1)
      //------------查找-------------
      val,flag := m2["野王"]
      if flag{
        fmt.Println("野王:",val)
      //------------遍历-------------
      for key,value := range m2{
        fmt.Println(key,value)
        //------------排序------------
      m2["野王2"] = "赵云"
      m2["野王3"] = "玛玛哈哈"
      m2["上单2"] = "马超"
      keys := []string{}
      for key,_ := range m2{
        keys = append(keys, key)
      sort.Strings(keys)
      fmt.Println("上单和野王排行榜:")
      for _,key := range keys{
        fmt.Println(key,m2[key])
         
  • key必须可以使用==比较,所以,数组是可以作为key的,但切片不行,类似于Python中的tuple和list
  • 向map存数据前需要make或初始化,仅使用var声明的是不行的,仅声明的话,那是nil
  • 更多Go相关内容:Go-Golang学习总结笔记

    有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。