Go语言map声明和初始化小结

2年前用过一段时间Go语言,最近用map测试一些功能的时候,编译各种报错。时间长了语法有些陌生是一个原因,另一个主要原因是之前没有全面掌握。

这里就简单小结map的声明和初始化的方法。

你可能也知道map的声明和初始化方法有两种, 直接初始化和使用make,如下

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

第一部分 描述

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

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

package main

import "fmt"

// 第一种方式, 声明并初始化具体内容
var m map[int]int = map[int]int{1: 100, 2: 200}

// 第二种方式,声明并初始化空map
var m1 map[int]int = make(map[int]int)
var m2 map[int]int = make(map[int]int, 10)

func main() {
	m[3] = 300
	fmt.Println(m, m[1])
	m1[1] = 400
	fmt.Println(m1, m1[0], len(m1))
	m2[1] = 500
	fmt.Println(m2, m2[0], len(m2))
}

以上输出结果

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同样适用,所以以下两种写法等价

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 所以:=只能在函数中使用

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

二、全局声明、局部初始化
局部必须初始化才能使用

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)
}

以上输出结果

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

三、局部声明和初始化

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)
}

以上输出结果

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类型误加括号

var m map[int][int]

编译提示:syntax error: unexpected newline, expecting type

正确写法

var m map[int]int

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

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

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

正确写法

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

2、格式化输出map变量

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

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

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

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

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

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

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

参考
segfentfault: 刚学go,为什么这么写会报错?
Go圣经Map【比较全面】
Go官方make内置函数

发表评论

电子邮件地址不会被公开。 必填项已用*标注