go语言指针类型和值类型区别

2020-06-14  本文已影响0人  云龙789

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.引用类型的一些特点

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]
}
上一篇 下一篇

猜你喜欢

热点阅读