之前写python 脚本比较多,对于python中的字典类型数据,创建非常简单,很灵活,但是在golang中有时却很不习惯,从而造成一些困扰。 本文记录一下在golang中创建map的一些细节问题。

golang的变量分为值类型与引用,值类型包括整型、浮点型、bool型、string 数组、结构体 变量地址中直接保存值,对于值类型的变量,声明以后,如果不赋值,那么变量的值为该类型的零值,如整型为0, bool类型为false,golang 的引用类型包括 slice、map、channel、function、pointer 等,如果没有赋值则为nil, 对于nil的变量,是不可以直接使用的。

值类型变量的创建

var xxx typea := xxx
1
2
3
4
5
6
func main() {
	var s string
	var i int
	ii := false
	fmt.Println(s, i, ii, &s, &i, &ii)
}

以上代码 s为"", i为0,ii为 false,是bool类型。

对于值类型的数据,无论它是否显示的进行初始化,我们在尝试打印它的地址的时候,都可以正常的获取到地址,即变量的地址不是nil

创建map的几种方式

var m map[string]intmap[string]int0x0
1
2
3
4
5
6
7
8
func main() {
	var m map[string]int
	if m == nil {
		fmt.Println("m is nil")
	}

	fmt.Printf("%p\n", m)
}
m is nil
m["age"] = 18
new(Type)*Type
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func main() {

	m := new(map[string]int)
	if m == nil {
		fmt.Println("m is nil")
	}

	fmt.Printf("%p\n", m)
	fmt.Println(*m)
}
m==nil
(*m)["age"]=18
1
2
3
4
5
6
7
8
func main() {

	m := new(map[string]int)
	*m = map[string]int{}

	(*m)["name"] = 18
	fmt.Println(*m)
}
  1. make 方式
1
2
3
4
5
6
7
8
9
func main() {

	m := make(map[string]int)
	fmt.Printf("%p\n", m)
	fmt.Println(m)
	m["age"] = 9
	fmt.Println(m)
	fmt.Printf("%p\n", m)
}

使用make方式可以返回一个声明并初始化的变量,对于这个变量,我们可以对其进行直接操作。 上面代码输出为

1
2
3
4
0xc00006e180
map[]
map[age:9]
0xc00006e180
var s string = "name"
1
2
3
4
5
func main(){
  var m = map[string]int{} //这里的{} 不能少
  m["age"] = 18
  fmt.Pringln(m)
}

json 中的应用

有很多时候,我们将json进行反序列化的时候,会转成结构体或者map,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func main() {
	jstr := `{"name":"yangyanxing", "age": 18}`
	var m map[string]interface{}
	mm := make(map[string]interface{})
	var mmm = map[string]interface{}{}
	var mmmm = new(map[string]interface{})
	json.Unmarshal([]byte(jstr), &m)
	json.Unmarshal([]byte(jstr), &mm)
	json.Unmarshal([]byte(jstr), &mmm)
	json.Unmarshal([]byte(jstr), mmmm)
	fmt.Println(m)
	fmt.Println(mm)
	fmt.Println(mmm)
	fmt.Println(*mmmm)
}
json.Unmarshl&

参考文章