Golang map

Golang map

声明

var map identifier [keytype]valuetype

Java中的HashMap相似, 可以使用多种类型作为key,

但是除slice, map, function

注意: 声明是不会分类内存的, 初始化需要make, 分配内存后赋值使用

  • 相同的key, 会覆盖之前的值
  • key-value无序
  • len(map)获取mapsize
  • 如果通过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])
   }
}
posted @ 2020-08-11 18:58  CyberPelican  阅读(235)  评论(0编辑  收藏  举报