1、原理及使用规则
unsafe.Pointer
源码就两行:
type ArbitraryType int //表示任何类型
type Pointer *ArbitraryType //表示任何类型的指针
unsafe.Pointer
的源码注释还提供了关于unsafe.Pointer
的四点重要的使用规则:
1、Go语言常规的任何类型的指针都可以转化为unsafe.Pointer类型
2、unsafe.Pointer类型可以转化为Go语言常规的任何类型的指针。
3、uintptr这个类型可以转化为unsafe.Pointer
4、unsafe.Pointer可以转化为uintptr
uintptr
是啥?
注意看uintptr
的位置,和int
以及uint
在一个包内,你可以认为uintptr与它们"同类"
,只不过是指针的专属
而已,但是你想自己定义用也能用。
对于unsafe.Pointer
,多用于Go的编译时期;由于它可以绕过类型系统
,直接去访问内存
,所以它用起来效率会比较高,但是官方的态度是不太建议使用的,因为不太安全。
2、unsafe.Pointer的使用
(1)go语言是强类型语言,不能直接强转,只有底层的基本类型是一致的才可以进行强转。
type kkk int
var num int
num = 111
//这时的强转是允许的
num2:=kkk(num)
(2)使用unsafe.Pointer进行类型强转
var num1 int32
var num2 uint32
num1 = 111
num2 = *(*uint32)(unsafe.Pointer(&num1))
学习链接:https://blog.csdn.net/i6448038/article/details/105259787
https://blog.csdn.net/cbmljs/article/details/82982539