本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
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学习总结笔记
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。