golang 三种指针类型具体类型的指针、unsafe.Pointer、uintptr作用


本文摘自网络,作者aseto,侵删。

原博客地址

总结

golang的三种指针类型

  1. 具体类型的指针,如int、string等
  2. unsafe.Pointer,在unsafe下面,任何具体类型的指针都能转化成Pointer,可以实现不同类型的指针的互相转化,充当桥梁的作用
  3. uintptr,golang源码的注释为能存储任何类型的指针的类型,uintptr可以进行指针计算,然后对对应的指针地址的变量进行复制,完成一些黑魔法

具体类型的指针

具体类型的指针,平时开发使用的很多,不同指针类型不能进行转化,主要用作参数

unsafe.Pointer

开发者开发过程使用的很少,在golang源码中使用的比较多,可以充当桥梁,实现不同类型的指针的转换

  1. 任何类型的指针可以转换成Pointer
  2. Pointer可以转换成任何类型的指针
  3. uintptr可以转换成Pointer
  4. Pointer可以转换成uintptr

    uintptr

    开发者开发过程使用的很少,在golang源码中使用的比较多,实现指针的计算

例子

实现struct里面的未导出的变量的赋值
Demo的内存存储结构: 在这里插入图片描述

demo/demo.go

type Demo struct {
    a int32
    b byte
    c int64
}

main.go 打印出来为 &{1 97 2}

d := new(demo.Demo)

    // 获取a的地址并转化为int32,然后进行赋值
    *(*int32)(unsafe.Pointer(d)) = 1
    // 获取b的地址,需要加上int32的地址,然后进行赋值
    *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(d)) + unsafe.Sizeof(int32(0)))) = 'a'
    // 获取c的地址,需要加上int64的大小,因为进行了内存对齐,后续会弄一篇博客阐述内存对齐,大致就是按照最大的内存大小的内存对齐,下面就是int64的大小对齐,如下面的就是按照int64对齐,因为int32加上byte为5byte,比int64的8byte小,就只需要一个int64就行
    *(*int64)(unsafe.Pointer(uintptr(unsafe.Pointer(d)) + unsafe.Sizeof(int64(0)))) = 2

    fmt.Println(d)


相关阅读 >>

Go-grpc-rest环境搭建

Golang组件化网络服务器框架halia指南

Gocn酷Go推荐】Go程序配置利器-viper库

Go中的方法与接收器

Golang依赖注入工具wire指南

堆排序

Golang怎么判断字符串是否为空

ddd lite:ddd 领域驱动设计微服务简化版

教你用Golang实现直播和点播功能

Golang如何做一个服务器?

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...