从Java的指针到Go的指针

本文探讨了从Java到Go语言的指针概念转变。Java中参数传递通常是值的拷贝,而在Go中,可以使用指针直接指向变量的内存地址。Go中的类型指针不支持偏移和运算,但提供了按引用传递参数的能力。切片作为引用类型,基于数组,具有安全性和动态扩容的特性。在使用指针时,需要注意指针的创建、切片的扩容行为以及何时选择值传递或指针传递。
摘要由CSDN通过智能技术生成

指针

学Java以来,忽略了指针和内存地址这些概念,Java帮我们封装了对象,简化了对象引用之间的关系。在Go语言中,又帮我们回忆起这些概念。

内存地址

每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。
所以一个常量或者是没有赋值的量是没有内存地址的

i := 1997
fmt.Printf("num is : %d, it's location in memory: %p\n",i,&i)
//输出:num is : 1997, it's location in memory: 0x1400011a168

Go语言取地址的符号是&,从地址取值用*
易得 var == *(&var)

0x开头代表十六进制。32位的CPU理论最多支持4GB的内存空间,CPU只能寻址2的32次方(4GB)。64位操作系统的寻址能力就是2的64次方。也就是17179869184G。当然这是理论还得看具体主板支持。

Go的指针

两个核心概念:

  • 类型指针,允许对这个指针类型的数据进行修改,传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。
  • 切片,由指向起始元素的原始指针、元素数量和容量组成

类型指针

i := 1997
address := &i
fmt.Printf("num is : %d, it's location in memory: %p ,type is: %T \n",i, address,reflect.TypeOf(address))
//num is : 1997, it's location in memory: 0x1400011a168 ,type is: *int

i代表变量,&i代表变量i的地址,address接受其地址对应类型是*T,这里是*int

Java中的参数传递,传递的是值的拷贝(只是这个有时候是指针),但是在Go中你可以使用指针来传递这个值,它直接指向了这个值的内存地址,并且只占用了4个或者8个字节。

Go 默认使用按值传递来传递参数,也就是传递参数的副本。函数接收参数副本之后,在使用变量的过程中可能对副本的值进行更改,但不会影响到原来的变量 。如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址(变量名前面添加&符号,比如 &variable)传递给函数,这就是按引用传递 。此时传递给函数的是一个指针 。方法中常写*sync.Mutex 来接受参数

变量、指针和地址三者的关系是:每个变量都拥有地址,指针的值就是地址,变量加&等于指针,指针加*等于指向变量。

所以指针也可以用来互换值。Go语言的flag包中,定义的指令以指针类型返回。(用于命令行解释)

//定义一个类型,用于增加该类型方法
type sliceValue []string

//new一个存放命令行参数值的slice
func newSliceValue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值