golang unsafe 和 uintptr 指针

本文详细介绍了Golang中 unsafe 和 uintptr 指针类型及其转换关系。通过示例展示了如何使用 unsafe 操作slice、访问struct的私有属性,以及实现字符串到byte数组的原地转换。同时,文章指出了这种操作可能存在的问题,如转换后的[]byte Cap未正确初始化,并给出了解决方案。
摘要由CSDN通过智能技术生成

golang unsafe 和 uintptr 指针

1.golang中的指针类型

三个类型
其实指针有三种:
一种是我们常见的*,用*去表示的指针;
一种是unsafe.Pointer,Pointer是unsafe包下的一个类型;
最后一种是uintptr,uintptr 这玩意是可以进行运算的也就是可以++–;

他们之间有这样的转换关系:
*<=> unsafe.Pointer <=> uintptr

有一点要注意的是,uintptr 并没有指针的语义,意思就是 uintptr 所指向的对象会被 gc 无情地回收。而 unsafe.Pointer 有指针语义,可以保护它所指向的对象在“有用”的时候不会被垃圾回收。
从这样的关系你大概就可以猜到,我们使用的指针*p转换成Pointer然后转换uintptr进行运算之后再原路返回,理论上就能等同于进行了指针的运算。我们下面就来实践一下。

2.具体操作

unsafe操作slice

func main() {
   
    s := make([]int, 10)
    s[1] = 2
    
    p := &s[0]
    fmt.Println(*p)
    
    up := uintptr(unsafe.Pointer(p)) //这里有可能会被回收 所以最好写成 (*int)unsafe.Pointer(uintptr(unsafe.Pointer(p))+unsafe.Sizeof(int(0)))
    up += unsafe.Sizeof(int(0)) // 这里不是up++

    p2 := (*</
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值