首页 > 其他分享 >Go 快速入门指南 - Map

Go 快速入门指南 - Map

时间:2022-12-24 18:37:41浏览次数:42  
标签:Map 入门 val fmt two zero key Go

概述

​Map​​​ 是一种键值对的无序集合,在其他编程语言中也被称为 ​​字典​​​, ​​Hash​​​, ​​关联数组​​。

重要的一点是: ​​Map 键​​ 的数据类型必须是可以比较的,例如 ​​string​​​, ​​int​​​, ​​float64​​, 具体的类型比较规则后面的章节会讲到,读者可以先使用简单数据类型来进行实验。

​Map 值​​ 的数据类型可以是任意的。

语法规则

# 声明
var 变量名 map[键数据类型]值数据类型

# 声明及初始化
var 变量名 = make(map[键数据类型]值数据类型, 长度) // 长度参数可以省略

获取值/改变值

package main

import "fmt"

func main() {
var m = make(map[string]int)

fmt.Printf("Map 长度 = %d\n", len(m))

m["zero"] = 0
m["one"] = 1
m["two"] = 2

fmt.Printf("Map 长度 = %d\n", len(m))

fmt.Printf("zero = %T, %v\n", m["zero"], m["zero"])
fmt.Printf("one = %T, %v\n", m["one"], m["one"])
fmt.Printf("two = %T, %v\n", m["two"], m["two"])
}

// $ go run main.go
// 输出如下
/**
Map 长度 = 0
Map 长度 = 3
zero = int, 0
one = int, 1
two = int, 2
*/

删除元素

调用 ​​delete()​​ 方法完成。

package main

import "fmt"

func main() {
var m = make(map[string]int)

fmt.Printf("Map 长度 = %d\n", len(m))

m["zero"] = 0
m["one"] = 1
m["two"] = 2

fmt.Printf("Map 长度 = %d\n", len(m))

delete(m, "one")
delete(m, "two")

fmt.Printf("Map 长度 = %d\n", len(m))
}

// $ go run main.go
// 输出如下
/**
Map 长度 = 0
Map 长度 = 3
Map 长度 = 1
*/

判断元素是否存在

package main

func main() {
var m = make(map[string]int)

m["zero"] = 0
m["one"] = 1
m["two"] = 2

if _, ok := m["zero"]; ok {
println(`m["zero"] 元素存在`)
}

delete(m, "zero")

if _, ok := m["zero"]; !ok {
println(`m["zero"] 元素不存在`)
}
}

// $ go run main.go
// 输出如下
/**
m["zero"] 元素存在
m["zero"] 元素不存在
*/

遍历 Map

重要的一点是: Map 遍历是无序的。 所以不能依赖于遍历的顺序,不论是 ​​键​​​ 还是 ​​值​​​, 如果需要遍历时永远保持相同的顺序,需要提前将 ​​键​​ 做排序处理,参考 有序 Map 小节。

package main

import "fmt"

func main() {
var m = make(map[string]int)

m["zero"] = 0
m["one"] = 1
m["two"] = 2

for k, v := range m {
fmt.Printf("key = %s, val = %d\n", k, v)
}

println("\n遍历 3 次,每次输出的结果可能不一样\n")
for i := 0; i < 3; i++ {
for k, v := range m {
fmt.Printf("key = %s, val = %d\n", k, v)
}
fmt.Printf("第 %d 次遍历完成\n\n", i+1)
}
}

// $ go run main.go
// 输出如下
/**
key = zero, val = 0
key = one, val = 1
key = two, val = 2

遍历 3 次,每次输出的结果可能不一样

key = one, val = 1
key = two, val = 2
key = zero, val = 0
第 1 次遍历完成

key = zero, val = 0
key = one, val = 1
key = two, val = 2
第 2 次遍历完成

key = one, val = 1
key = two, val = 2
key = zero, val = 0
第 3 次遍历完成
*/

备注: 你的输出应该和这里不一样,多运行几次,看看是否每次都不一样。

并发不安全

最后要说明的很重要的一点是: ​Map​​ 不是并发安全的, 也就是说,如果在多个线程中,同时对一个 Map 进行读写,会报错。 互斥锁 提供了一个简单的解决方案,后面会专门写一篇文档来说明如何才能 ​​并发安全​​。

Go 快速入门指南 - Map_Go

标签:Map,入门,val,fmt,two,zero,key,Go
From: https://blog.51cto.com/u_15915979/5967425

相关文章

  • Go 快速入门指南 - 有序 Map
    概述​​Map​​​ 的遍历是无序的,这意味着不能依赖遍历的键值顺序。如果想实现Map遍历时顺序永远一致,一个折中的方案时预先给Map的 ​​键​​ 排序,然后根据排序后......
  • Go 快速入门指南 - make 和 new
    概述​​new()​​ 函数为数据类型T分配一块内存,初始化为类型T的零值,返回类型为指向数据的指针,可以用于所有数据类型。​​make()​​​ 函数除了为数据类型T分配内......
  • Go 快速入门指南 - 变长参数和指针参数
    变长参数在函数的最后一个参数的数据类型之前加上省略号 ​​...​​​ ,表示该参数的数据类型是 ​​变长类型​​​,调用该函数时可以传递任意数量 ​​(0-N)​​......
  • Go 快速入门指南 - defer 函数
    概述一个 ​​defer​​ 语句就是一个普通的函数或方法调用。 ​​defer​​ 语句保证了不论是在正常情况下(return返回),还是非正常情况下(发生错误,程序终止),函数......
  • Go 快速入门指南 - panic/recover 函数
    panic​​panic​​​ 会终止程序并退出,因此只有在发生严重的错误时才会使用 ​​panic​​。例子主动触发packagemainfuncmain(){panic("someerror...")}//$go......
  • Go 快速入门指南 - 结构体
    概述​​结构体​​​ 是将零个或多个字段(变量)组合在一起的复合数据类型,类似于面向对象语言中的 ​​对象​​。结构体以及其字段都使用 可见性 规则。语法规则type......
  • Go 快速入门指南 - 嵌套结构体
    概述Go支持将多个结构体通过嵌套的方式,组成一个大的结构体,降低了单个结构体复杂度,同时提高了结构体之间组合的灵活性。例子为了省略篇幅,本小节只使用 ​​字面量​​​ ......
  • Go 快速入门指南 - 函数
    概述​​函数​​ 是将一个或者一类问题包装为一个代码块,可以被多次调用,提高代码重用性。Go函数中声明、定义、参数、返回值这些基础概念,和其他编程语言中的一致,这里不再......
  • Go 快速入门指南 - init 函数
    概述​​init()函数​​ 是一个特殊的函数,一般称为初始化函数,不能被调用。 在每个文件里面,当程序启动或者文件被作为包引用的时候,init()函数就会自动执行,一般用来做一......
  • Go 快速入门指南 - 接口和方法
    接口Go接口是隐式实现。 对于一个数据类型,无需声明它实现了哪些接口,只需要实现接口必需的方法即可。当然了,存在一个小问题就是:我们可能无意间实现了某个接口:),所以 ​......