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