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

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)

}

8aa813eb8041

引用类型结果

8aa813eb8041

值类型结果

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]

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值