复合数据类型

96 阅读1分钟

map

简介

map类型需要保持key的唯一性, 因此必须支持“==”和“!=”两种比较操作符.

func map slice 只支持与nil比较, 不支持变量比较,因此不可以作为map的key.

声明和初始化

不满足 “零值可用”

var m map[string]int // m = nil
m["key"] = 1 //出错

复合字面值

m := map[int]string{}
m := map[int]string{1:"一"}

make

m1 := make(map[int]string)
m2 := make(map[int]string, 8)

可以指定初始化长度,虽然没啥用,因为键值对超过数量,可以自动扩容.

基本操作

操作一: 插入新键值对

m := make(map[int]string)
m[1] = "one"

操作二: 获取键值对的数量

m := map[string]int {
    "key" : 1,
    "key" : 2,
}
len(m) //2

操作三: 查找和数据读取

查找一个不存在的键会返回零值

m := make(map[string]int)
v := m["key1"]

使用comma ok对map进行键值查找

if v, ok := m["key1"]; ok {
}

操作四: 删除数据

m := map[string] int { "key1" : 1, "key2" : 2 } delete(m, "key1")

操作五: 遍历map当中的数据

map 是无序的

for k,v := range m {
    fmt.Println("[%d, %d]", k, v)
}

map变量的传递开销

map也是引用类型, 作为参数传递的时候, 传递一个描述符. 函数内部做的修改会影响外部.

map内部实现

其他问题

不可以&m["key1"]对map元素取地址
不支持并发读写