Golang通脉之map概略

休闲 · 2026-07-22 06:00:38

Go言语中供给的通脉映拍照干容器为map,其内部独霸散列表(hash)完成 。概略

map 是通脉一种无序的键值对的集结 。map 最次要的概略一点是经由过程 key 来疾速检索数据,key 近似于索引 ,通脉指向数据的概略值 map 是一种集结 ,所以可以像迭代数组和切片那样迭代它。通脉不过,概略map 是通脉无序的 ,没法决意它的概略前去按序 ,这是通脉因为 map 是独霸 hash 表来完成的 ,Go言语中的概略map是援引圭表类型 ,必须初始化才调独霸 。通脉

独霸map过程中需求寄看的概略几点:

  • map是无序的 ,每次打印出来的通脉map都邑不一样  ,它不克不及经由过程index掉落踪掉落踪,而必须经由过程key掉落踪掉落踪
  • map的长度是不结实的 ,也就是和slice一样,也是一种援引圭表类型
  • 内置的len函数一样合用于map  ,前去map具有的key的数量
  • map的key可所以全数可斗劲的圭表类型 ,如布尔型、整数型、浮点型  、宏壮型 、字符串型……也可以键。

1 、定义

Go言语中 map的定义语法以下:

map[KeyType]ValueType

个中

  • KeyType:展示键的圭表类型 。
  • ValueType:展示键对应的值的圭表类型  。

**map圭表类型的变量默许初始值为nil,需求独霸make()函数来分拨内存 (声明并初始化) **  。

语法为:

make(map[KeyType]ValueType, [cap])

个中cap展示map的容量 ,该参数当然不是必须的 ,可是我们理应在初始化map的时辰就为其指定一个契合的容量。

可独霸内建函数 make ,也可独霸 map 关头字来定义 Map:

/* 声明变量,默许 map 是 nil */var mapVariable map[KeyType]ValueType /* 独霸 make 函数 */mapVariable = make(map[keyType]ValueType)rating := map[string]float32 { "C":5, "Go":4.5, "Python":4.5, "C++":2 }

假定不初始化 map ,那么就会成立一个 nil map。nil map 不克不及用来存放键值对

2、根本独霸

map中的数据都是成对展示的:

func main() {  scoreMap := make(map[string]int, 8) scoreMap["张三"] = 90 scoreMap["小明"] = 100 fmt.Println(scoreMap) fmt.Println(scoreMap["小明"]) fmt.Printf("type of a:%T\n", scoreMap)}

输进 :

map[小明:100 张三:90]
100
type of a:map[string]int

map也支撑在声明的时辰加添元素,比如 :

func main() {  userInfo := map[string]string{   "username": "张三",  "password": "123456", } fmt.Println(userInfo) //}

3、剖断键可否存在

Go言语中有个剖断map中键可否存在的出格写法 ,格式以下:

value, ok := map[key]func main() {  /* 成立集结 */   countryCapitalMap := make(map[string]string)      /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" // 假定key存在ok为true,v为对应的值;不存在ok为false,v为值圭表类型的零值 v, ok := countryCapitalMap["United States"] if ok {   fmt.Println("Capital of United States is", captial)     }else {       fmt.Println("Capital of United States is not present")    }}

4  、map的遍历

Go言语中独霸for range遍历map 。

func main() {  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" for k, v := range countryCapitalMap {   fmt.Println(k, v) }}

只想遍历key的时辰,可以按上面的写法 :

func main() {  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" for k := range countryCapitalMap {   fmt.Println(k) }}

寄看 :遍历map时的元素按序与添加键值对的按序有关  。

5、delete()函数删除map元素

独霸delete()内建函数从map中删除一组键值对,删除函数不前去任何值,delete()函数的格式以下 :

delete(map, key)

个中 ,

  • map:展示要删除键值对的map
  • key:展示要删除的键值对的键
func main(){  countryCapitalMap := make(map[string]string)   /* map 拔出 key-value 对,各个国度对应的首都 */   countryCapitalMap["France"] = "Paris"   countryCapitalMap["Italy"] = "Rome"   countryCapitalMap["Japan"] = "Tokyo"   countryCapitalMap["India"] = "New Delhi" delete(countryCapitalMap, "France")//将"France":"Paris"从map中删除 for k,v := range scoreMap{   fmt.Println(k, v) }}

6、指定按序遍历map

func main() {  rand.Seed(time.Now().UnixNano()) //初始化随机数种子  var scoreMap = make(map[string]int, 200)  for i := 0; i < 100; i++ {   key := fmt.Sprintf("stu%02d", i) //生成stu开首的字符串  value := rand.Intn(100)          //生成0~99的随机整数  scoreMap[key] = value } //掏出map中的全数key存进切片keys var keys = make([]string, 0, 200) for key := range scoreMap {   keys = append(keys, key) } //对切片举办排序 sort.Strings(keys) //屈就排序后的key遍历map for _, key := range keys {   fmt.Println(key, scoreMap[key]) }}

7、map圭表类型的切片

上面的代码切片中的元素为map圭表类型时的独霸 :

func main() {  var mapSlice = make([]map[string]string, 3) for index, value := range mapSlice {   fmt.Printf("index:%d value:%v\n", index, value) } fmt.Println("after init") // 对切片中的map元素举办初始化 mapSlice[0] = make(map[string]string, 10) mapSlice[0]["username"] = "张三" mapSlice[0]["password"] = "123456" mapSlice[0]["address"] = "深圳" for index, value := range mapSlice {   fmt.Printf("index:%d value:%v\n", index, value) }}

8、value为切片圭表类型的map

上面的代码演示了map中值为切片圭表类型的独霸 :

func main() {  var sliceMap = make(map[string][]string, 3) fmt.Println(sliceMap) fmt.Println("after init") key := "中国" value, ok := sliceMap[key] if !ok {   value = make([]string, 0, 2) } value = append(value, "北京", "上海") sliceMap[key] = value fmt.Println(sliceMap)}

9  、map是援引圭表类型

与切片近似 ,map是援引圭表类型  。当将map分拨给一个新变量时,它们都指向不异的内部数据筹划 。是以 ,一个的改削会回响此外一个 :

func main() {       personSalary := map[string]int{         "steve": 12000,        "jamie": 15000,    }    personSalary["mike"] = 9000    fmt.Println("Original person salary", personSalary)    newPersonSalary := personSalary    newPersonSalary["mike"] = 18000    fmt.Println("Person salary changed", personSalary) }

运转下场:

Original person salary map[steve:12000 jamie:15000 mike:9000] 
Person salary changed map[steve:12000 jamie:15000 mike:18000]

map不克不及独霸独霸符举办斗劲 。只能用来搜检map可否为空。不然会报错  :invalid operation: map1 == map2 (map can only be comparedto nil)

到此这篇关于Golang通脉之map概略的文章就引见到这了,更多相干Go言语 map内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !

文章推荐:

骨气|立冬二候·地始冻——触摸除夜地的质感

大胆鬼与旅途维纳斯符文搭配攻略

哈利波特魔法省悟魔法通缉令皮肤掉落踪掉落踪编制

刘诗诗压轴亮相VOGUE盛典,化身森中花仙子掀头纱封神!

奉贤购彩者掉落踪掉落踪体彩除夜乐透1263万除夜奖

《小娘惹之翡翠山》7月10日腾讯视频独家上线“小娘惹”再掀追剧热潮

三国志胡想除夜陆江山遗址新赛季河岳凝晖气焰搭配推荐攻略

口袋学院物语2气候类建筑解锁前提一览2022

《Z世代数字不雅不雅不雅不雅鉴赏陈述》展示 ,年青人全年“书评”字数总量达25万本《论语》

王者名望花朝挑衅活动攻略

尽对回结冠星之名活动弄法攻略

《深港河畔》单曲文案

热门浏览