Go Map、Slice、Chan 的传值方式

对比 Map、Slice、Chan 的传值方式

Map

m1:

func main() {
	m := make(map[int]int)
	mdMap(m)
	fmt.Println(m)
}

func mdMap(m map[int]int) {
	m[1] = 100
	m[2] = 200
}

// 结果: map[2:200 1:100]

m2:

func main() {
	var m map[int]int
	mdMap(m)
	fmt.Println(m)
}

func mdMap(m map[int]int) {
	m = make(map[int]int)
	m[1] = 100
	m[2] = 200
}
// 结果: map[]

Slice

s1:

func main() {
	s := make([]int, 2)
	mdSlice(s)
	fmt.Println(s)
}

func mdSlice(s []int) {
	s[0] = 1
	s[1] = 2
}

// 结果: [1 2]

go-map

s2:

func main() {
	var s []int
	mdSlice(s)
	fmt.Println(s)
}

func mdSlice(s []int) {
	s = make([]int, 2)
	s[0] = 1
	s[1] = 2
}
// 结果:  []
// 这里我们需要把 slice 想象为特殊的指针,其已经保存了所指向内存区域长度,所以 append 之后的内存并不会反映到 main() 中

go-slice

Chan