1.类型的区分

指针类型: map、sclice 和 channel,他们的空值都是 nil,

值类型:比如 int、数组等

2.引用类型和值类型的区别

1.引用类型被多个变量接收后,表示的都是同一个内存地址,

改变任何一个变量值,相当于改了所有变量值

2.值类型被多个变量接收后,表示的都是各自的内存地址,

改变任何一个变量值,相当于改了自己变量的值

指针类型保存的是地址,值类型保存的是具体的值

2.1 demo

// 引用类型

func main() {

scores := []int{1, 2, 3, 4, 5}

scores[0] = 100

b := scores

b[1] = 200

c := scores

c[2] = 300

fmt.Println(scores)

fmt.Println(b)

fmt.Println(c)

fmt.Printf("%p\n", &scores)

fmt.Printf("%p\n", &b)

fmt.Printf("%p\n", &c)

}

// 值类型

func main() {

a := 123

b := a

c := b

a = 1

b = 2

c = 3

fmt.Println(a)

fmt.Println(b)

fmt.Println(c)

fmt.Printf("%p\n", &a)

fmt.Printf("%p\n", &b)

fmt.Printf("%p\n", &c)

}

引用类型结果

值类型结果

3.make 和 new 初始化的区别

1.new 用来分配除了引用类型之外的其他类型内存

2.make 来分配指针类型的数据内存

3. new 初始化仅仅是分配了一段内存

4.我们拿切片来举例 make 的作用

切片的本质是内存的一部分。初始化的时候,我们必须要为一个底层数组分配一段内存,同时也要初始化这个切片

长度是切片的长度,容量是底层数组的长度。所以 new 是不具备这个功能的,不能给 指针类型 数据初始化

demo

new(X) 的结果与 &X{} 相同。

goku := new(Saiyan)

// 等同于

goku := &Saiyan{}

4.引用类型的一些特点

1.必须先使用 make 初始化数据,才能对数据做出修改,因为初始化了,才会分配内存

2.引用类型本质上是操作内存地址对应的值,所以如果将这个数据赋值给多个变量后,任何一个变量改变值,改变的是所有变量的数据

func main() {

scores := []int{1, 2, 3, 4, 5}

scores[0] = 100

b := scores

b[1] = 200

// scores[1] 的值也是200

fmt.Println(scores) // [100 200 3 4 5]

fmt.Println(b) // [100 200 3 4 5]

}