map的声明和初始化方法有两种, 直接初始化和使用make,如下

1
2
3
var m1 map[int]int = map[int]int{1: 100, 2: 200}
var m8 map[int]int = make(map[int]int, 10)

第一部分 描述

这里重点对全局map变量和局部变量展开说明,分三种情况

一、全局声明并初始化
函数中可以直接使用map变量

以上输出结果

1
2
3
4
API server listening at: 127.0.0.1:18268
map[1:100 2:200 3:300] 100
map[1:400] 0 1
map[1:500] 0 1

说明:
0、Golang变量声明的时候不能省略类型,但是声明并赋值的时候可以省略类型,自动推导。map同样适用,所以以下两种写法等价

1
2
var m map[int]int = map[int]int{1: 100, 2: 200}
var m = map[int]int{1: 100, 2: 200}

1、Golang和C一样,所有的运算都应该在函数内进行,函数外进行报语法错误。
1.0 函数体外初始化变量就两个办法,要么一次性全部赋值,要么先声明(全局/局部)变量,在某个函数内进行赋值,在函数体外进行结构体成员赋值相当于函数外面进行运算了
1.1 所以:=只能在函数中使用

1
2
3
4
5
6
7
8
9
10
package main

import "fmt"

var m map[int]int
m[1] = 100
func main() {
fmt.Println(m)
}

以上错误代码,编译报错:syntax error: non-declaration statement outside function body
二、全局声明、局部初始化
局部必须初始化才能使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

var m3 map[int]int
var m4 map[int]int

func main() {
fmt.Println(m3)
// 直接使用会出现panic
// m3[3] = 300
// 第一种方式初始化
m3 = map[int]int{1: 100, 2: 200}
m3[3] = 300
fmt.Println(m3)

// 第二种方式初始化
m4 = make(map[int]int, 10)
m4[4] = 400
fmt.Println(m4)
}

以上输出结果

1
2
3
4
API server listening at: 127.0.0.1:49253
map[]
map[1:100 2:200 3:300]
map[4:400]

三、局部声明和初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import "fmt"

func main() {
// 第一种方式[可以省略变量类型]
// var m5 = map[int]int{1: 100, 2: 200}
var m5 map[int]int = map[int]int{1: 100, 2: 200}
m5[3] = 300
fmt.Printf("m5 = %v\n", m5)

// 第二种方式
var m6 map[int]int
m6 = map[int]int{1: 100, 2: 200}
m6[3] = 300
fmt.Printf("m6 = %v\n", m6)

// 第三种方式
var m7 map[int]int
// 必须要初始化
m7 = make(map[int]int)
m7[1] = 100
fmt.Printf("m7 = %v\n", m7)

// 第四种方式
m8 := map[int]int{1: 100, 2: 200}
fmt.Printf("m8 = %v\n", m8)

// 第五种方式
m9 := make(map[int]int, 10)
m9[1] = 100
fmt.Printf("m9 = %v\n", m9)
}

以上输出结果

1
2
3
4
5
6
API server listening at: 127.0.0.1:10546
m5 = map[1:100 2:200 3:300]
m6 = map[1:100 2:200 3:300]
m7 = map[1:100]
m8 = map[1:100 2:200]
m9 = map[1:100]

第二部分 总结

新手写map常见错误
0、map value类型误加括号

1
var m map[int][int]

编译提示:syntax error: unexpected newline, expecting type
正确写法

1
var m map[int]int

1、初始化写错【新手特别容易出错

1
var m map[int]int{1: 100, 2: 200}

VSCode提示: expected ‘;’, found ‘{‘ syntax
编译提示:syntax error: unexpected { after top level declaration
正确写法

1
var m = map[int]int{1: 100, 2: 200}

2、格式化输出map变量

1
2
3
var m = map[int]int{1: 100, 2: 200}
fmt.Printf("m = %v\n", m)
// m = map[1:100 2:200]

3、在函数中定义一个空map

1
2
3
m := make(map[byte]int)
// 等价
m := map[byte]int{}

4、声明了没有初始化的map是一个值为nil的map,向这样的map中存入元素,将导致panic异常
panic: assignment to entry in nil map

1
2
var m map[string]string
m["name"] = "salmonl"

5、使用make初始化map可以忽略size参数,系统会分配一个较小的参数

1
func make(t Type, size ...IntegerType) Type