Golang | map的定义和使用

Map

map是一堆键值对的未排序集合,比如以身份证号作为唯一键来标识一个人的信息。

map是引用类型,键必须支持相等运算符(==,!=)类型,比如:int,string,float等内建类型,只含有内建类型的结构体可以作为key。值可以是任意类型,没有限制。

初始化

	var m1 map[string]string
	m2 := make(map[string]string) 

map作为参数传递给函数的代价非常的小,一般在32位位的机器上只需要4字段,64位的机器上需要8字节,并且无论是多少数据,在 map 中通过 key 查找对应的 value 非常的快的。

我们使用 map 的时候,如果事先知道元素所存数量的大小,我们我可能过 make 函数预先给一个合理的数,有助于提升性能,因为事先申请了一大块内存,可以避免后续操作时频繁扩张。

	m := make(map[string]string,100) 

简单使用

  func main() {
    m := map[string]string{
      "a":"1",
      "b":"2",
    }													// 初始化

    if v, ok := m["a"]; ok { 	// 判断 a 是否存在,并获取 a 对应的值
      fmt.Println(v)
    }

    fmt.Println(m["c"])				// 直接取不存在的值也不会报错,只会打印对应类型的初始值

    m["a"] = "10"							// 修改或添加map中的值

    delete(m,"c")							// 删除,如果 key 不存在也不会报错

    fmt.Println(len(m))				// 打印对应键值对的数量

    for k, v := range m {			// 遍历 map,随机返回key
      fmt.Println(k,v)
    }
  }

map中delete的使用

  func main() {
    m := make(map[int]struct{})  // 没有值的时候,可以使用 struct{} 初始化,节省空间
    for i := 0; i < 10; i++ {
      m[i] = struct{}{}
    }
    fmt.Println(m)
    for k, _ := range m {
      delete(m,k)				// 可以在选代的时候安全的删除 map 中的值,但是添加就不可以了
    }
    fmt.Println(m)
  }

map中添加或者修改时需注意

  func main() {
    // 因为map是无序的,每次扩张的时候,都会改变无素的位置
    // 所以无法通过 key 直接修改value内部的值
    m := map[string]user{
      "a":{"张三"},
    }
    m["a"].name = "李四"

    // 但是如果 value 是指针类型的,通过key 可以直接取到 value 的指针
    // 就可以通过这种方法修改 value 内部的值
    m2 := map[string]*user{
      "a":&user{"张三"},
    }
    m2["a"].name = "李四"
  }

Map 是无序的,但是有时候,我们想有序的取到 map 内部的值,所以我们只能通过对key进行排序,然后再通过key的值取对应value 的值。



关注公众号,随时获取最新资讯

细节决定成败!
个人愚见,如有不对,恳请斧正!

posted @ 2022-03-27 02:18  一点浩然气~  阅读(269)  评论(0编辑  收藏  举报