Go语言学习之旅09——map

map的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func main() {
// 定义map 方法一
m1 := map[string]string{
"A": "a",
"B": "b",
}

// 定义map 方法二 empty map
m2 := make(map[string]string)

// 定义map 方法三 nil
var m3 map[string]string

fmt.Println(m1) // map[A:a B:b]
fmt.Println(m2) // map[]
fmt.Println(m3) // map[],注意:此map为nil
}

map的赋值

1
2
3
4
5
6
7
func main() {
m1 := make(map[string]string, 10)
fmt.Println(m1, len(m1)) // map[] 0,注意:这里只是初始化了他的容量,但是len依然是0
m1["A"] = "a" // go语言的赋值方式
m1["B"] = "b"
fmt.Println(m1, len(m1)) // map[A:a B:b] 2
}

map的遍历

1
2
3
4
5
6
7
8
9
10
func main() {
m1 := map[string]string{
"A": "a",
"B": "b",
}

for k, v := range m1 {
fmt.Printf("ket = %s, v = %s\n", k, v)
}
}

补充:map的遍历不保证顺序

map的取值

1
2
3
4
5
6
7
func main() {
m1 := map[string]string{
"name": "sherlock",
}

fmt.Println(m1["name"]) // sherlock
}

当所取的key不存在时:

1
2
3
4
5
6
7
func main() {
m1 := map[string]string{
"name": "sherlock",
}

fmt.Printf("%q", m1["age"]) // ""
}

我们可以通过接收第二个返回值来保证map的key存在:

1
2
3
4
5
6
7
8
9
10
11
func main() {
m1 := map[string]string{
"name": "sherlock",
}

name, result1 := m1["name"]
age, result2 := m1["age"]

fmt.Printf("name = %q, result1 = %t\n", name, result1) // name = "sherlock", result1 = true
fmt.Printf("age = %q, result2 = %t\n", age, result2) // age = "", result2 = false
}

注意:m1[key]有两个返回值,第一个返回值是key对应的value,第二个返回值是key是否存在的布尔值;若key不存在,取出的value是空字符串

安全取值:

1
2
3
4
5
6
7
8
9
10
11
func main() {
m1 := map[string]string{
"name": "sherlock",
}

if v, result := m1["name"]; result {
fmt.Println("value =", v)
} else {
fmt.Println("map中不存在该key")
}
}

map的删除

1
2
3
4
5
6
func main() {
m1 := map[string]string{"A": "a", "B": "b", "C": "c"}
// 删除键为B的键值对
delete(m1, "B")
fmt.Println(m1) // map[A:a C:c]
}

map作函数参数是引用传递

1
2
3
4
5
6
7
8
9
10
11
12
13
func main() {
m1 := map[string]string{
"A": "a",
"B": "b",
"C": "c",
}
testMap(m1)
fmt.Println(m1) // map[B:Z C:c A:a]
}

func testMap(m map[string]string) {
m["B"] = "Z"
}