unsafe.Pointer 和 uintptr
程序员文章站
2022-03-04 18:51:16
...
前言
unsafe.Pointer 是一个万能指针类型,对应c语言中的 void *
unitptr 是一个整数类型,可以进行算术运算
若想要对指针指向的值进行修改,必须转换为uintptr类型,再强转为 (指针)(unsafe.Pointer())
例子
func main() {
a:=[4]int{0,1,2,3}
p1:=unsafe.Pointer(&a[1])
p3:=uintptr(p1)+2*unsafe.Sizeof(a[0])
*(*int)(unsafe.Pointer(p3))=6
fmt.Println(a)
//------
type Person struct {
name string
age int
gender bool
}
who := Person{"John", 30, true}
pp := unsafe.Pointer(&who)
pname := (*string)(unsafe.Pointer(uintptr(pp) + unsafe.Offsetof(who.name)))
page := (*int)(unsafe.Pointer(uintptr(pp) + unsafe.Offsetof(who.age)))
pgender := (*bool)(unsafe.Pointer(uintptr(pp) + unsafe.Offsetof(who.gender)))
*pname = "Alice"
*page = 28
*pgender = false
fmt.Println(who) // {Alice 28 false}
}
推荐阅读
-
斗鱼tv怎么送鱼丸给主播 怎么签到和分享领取鱼丸
-
建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板
-
Objective-C处理空字符串和页面传值及自定义拷贝
-
iOS开发中Date Picker和UITool Bar控件的使用简介
-
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
-
笔记本电脑的内存DDR3和GDDR5显存大概能差多少
-
微软:免费为Android和iOS推出杀毒软件
-
Java学习总结之方法重载和方法重写
-
C#中try catch中throw ex和throw方式抛出异常有何不同
-
郭明錤:疫情影响下 苹果尽全力准备AirPods和iPhone 12