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]
}