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

1、初始化写错

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

编译提示:syntax error: unexpected { after top level declaration

2、格式化输出map变量

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

参考:
segfentfault: 刚学go,为什么这么写会报错?

发表评论

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