Go Map

定义

map:一种特殊的数据结构,元素对的无序集合,也称关联数组或字典。快速寻找值的理想结构,给定key,对应的value可以快速定位,在其它语言中,也称为hash,hashTable,字典(Python)

声明、初始化和 make

// keytype和valuetype之间允许空格,但是gofmt移除了空格
var map1 map[keytype]valuetype
var map1 map[string]int

在声明的时候不需要知道 map 的长度,map 是可以动态增长的,零值是nil

key可以是任意可以用==或!=操作符比较的类型
key不能是数组,切片,结构体(只包含内建类型的结构体是可以的)
key可以是指针或接口类型
例子:使用结构体作为key,可以提供Key(),Hash()方法,这样可以通过结构体的域计算出唯一的数字或者字符串的key

value可以是任何类型

map性能

map传递给函数的代价很小,在32位机器上占4个字节,64位机器上占8个字节,无论实际上存储了多少数据
通过key在map中寻找值是很快的,比线性查找快很多,但是比从数组和切片的索引中直接读取要慢100倍,所以如果很在乎性能的话,建议使用切片来解决问题

内存分配

map是引用类型
内存用make方法来分配

var map1 = make(map[keytype]valuetype)
等同于
var map1 = map[keytype]valuetype{}
注意不要使用new,永远使用make来创建map,如果错误的使用new分配了一个引用对象,你会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取了它的地址

在这里插入图片描述在这里插入图片描述

map动态伸缩

因为map不存在固定长度或最大限制,但是可以选择标明map的初始容量capacity
当map增长到容量上限的时候,如果再增加新的key-value,map的大小会自动加1,而且内存会成倍的增长,这里面存在一个内存拷贝的东西,会把老map中的内容转移到新的足够容量的内存地址上,所以出于性能的考虑,即使只是大概知道容量,也最好先标明

一个小技能点

一个key对应多个值的时候,可以将值放到一个切片中,优雅的解决这个问题

// 值是一个切片
mp1 := make(map[int][]int)
// 值是切片的引用地址
mp2 := make(map[int]*[]int)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值