Golang map
Golang map
声明
var map identifier [keytype]valuetype
和Java
中的HashMap
相似, 可以使用多种类型作为key
,
但是除slice
, map
, function
外
注意: 声明是不会分类内存的, 初始化需要make
, 分配内存后赋值使用
- 相同的
key
, 会覆盖之前的值 key-value
无序len(map)
获取map
的size
- 如果通过
map[key]
获取的值不存在返回 0
使用
方式一: make
func main() {
var m map[string]string
m = make(map[string]string, 10)
m["张三"] = "sandy"
m["李四"] = "swagger"
m["王五"] = "woody"
fmt.Println(m)
}
方式二: 直接声明
func main() {
//注意区别于数组arr := [...]string{0:"张三",1:"李四",2:"王五"}
m := map[string]string{
"张三": "sandy",
"李四": "swagger"}
m["王五"] = "woody"
fmt.Println(m)
}
特殊使用
func main() {
//以map为value
m:= map[string]map[string]string{
"101" : {"name":"张三","gender":"1"},
"102" : {"name":"李四","gender":"1"},
}
print("----------------------------")
m = make(map[string]map[string]string)
//如果未在声明时赋值, 需要malloc一块空间
m["101"] = make(map[string]string)
m["101"]["name"] = "张三"
m["101"]["gender"] = "男"
m["102"] = make(map[string]string)
m["102"]["name"] = "李四"
m["102"]["gender"] = "男"
}
通用操作
添加/C
func main() {
m := map[int]string{}
m[1] = "张三"
fmt.Println(m)
}
查找/R
func main() {
m := map[int]string{}
m[1] = "张三"
m[2] = "李四"
m[3] = "王五"
//通过key查找,val为对应key的value, flag为是否存在
val,flag := m[3]
fmt.Println(val)
fmt.Println(flag)
}
更新/U
func main() {
m := map[int]string{}
m[1] = "张三"
m[2] = "李四"
//覆盖key为2的k-v
m[2] = "王五"
fmt.Println(m)
}
删除/D
func main() {
m := map[int]string{}
m[1] = "张三"
m[2] = "李四"
m[3] = "王五"
fmt.Println(m)
//删除指定的key
delete(m, 2)
fmt.Println(m)
//删除map,将指针指向一个新的地址, 原先的map被GC
m = make(map[int]string)
}
map遍历
func traverse(m map[int]string){
for key, val := range m {
fmt.Println(key,val)
}
}
func main() {
m := map[int]string{}
m[1] = "张三"
m[2] = "李四"
m[3] = "王五"
traverse(m)
}
func main() {
//以map为value
m:= map[string]map[string]string{
"101" : {"name":"张三","gender":"1"},
"102" : {"name":"李四","gender":"1"},
}
for k1, nestedMap := range m {
for k2, val := range nestedMap {
fmt.Println(k1,k2,val)
}
}
}
map切片
注意!!!切片是有序的
func main() {
//初始了一个长度为1的切片
m := []map[string]string{
{
"name": "丁一",
},
}
//使用切片前必须初始化
m = make([]map[string]string, 5)
//初始化map
m[0] = make(map[string]string)
m[0]["name"] = "狗二"
//切片是有序的,append在切片的末尾添加
m = append(m, map[string]string{
"name": "张三",
})
fmt.Println(m)
}
map排序
注意!!!, 新版的Golang
, 如果key是数值类型按照从小到大排序, 如果是字符或是字符串按照字典序
func main() {
//key如果是数字按照从小到达, 如果是字符串按照字典序排序
m := map[string]int{
"z":100,
"abc": 200,
"ab": 12,
"za": 399,
"ba": 231,
}
fmt.Println(m)
}
旧版
func main() {
m := map[int]int{
1: 200,
10: 12,
4: 399,
2: 231,
}
fmt.Println(m)
var keys []int
for key, _ := range m {
keys = append(keys, key)
}
//将int slice按照从小到大排序
sort.Ints(keys)
fmt.Println(keys)
for _, val := range keys {
fmt.Println(val,m[val])
}
}