golang中unsafe包浅析
unsafe内容介绍func Alignof(x ArbitraryType) uintptr
func Offsetof(x ArbitraryType) uintptr
func Sizeof(x ArbitraryType) uintptr
type ArbitraryType int
type Pointer *ArbitraryType
这个包中,只提供了3个函数,两个类型。就这么少的量,却有着超级强悍的功能。学过C语言的都可能比较清楚,通过指针,知道变量在内存中占用的字节数,就可以通过指针加偏移量的操作,在地址中,修改,访问变量的值。在golang中,怎么去实现这么疯狂的操作呢?就得靠unsafe包了。 两个类型简介type ArbitraryType int
type Pointer *ArbitraryType
ArbitraryType 是int的一个别名,但是golang中,对ArbitraryType赋予了特殊的意义,千万不要死磕这个后边的int类型。通常的说,我们把interface{}看作是任意类型,是比较浪荡的型号,具有老少通吃的特点,那么ArbitraryType这个类型,在golang系统中,是人兽皆不在话下的类型。比interface{}还要随意。 Pointer 是int指针类型的一个别名,在golang系统中,可以把Pointer类型,理解成任何指针的亲爹。 下边附上golang document官方文档中的一段,对Pointer的使用场景的介绍 - A pointer value of any type can be converted to a Pointer.
- A Pointer can be converted to a pointer value of any type.
- A uintptr can be converted to a Pointer.
- A Pointer can be converted to a uintptr.
看这两个变量,没什么特殊的。提示一下:golang的指针类型长度与int类型长度,在内存中占用的字节数是一样的哟。 提示: 三个函数介绍func Alignof(x ArbitraryType) uintptr
func Offsetof(x ArbitraryType) uintptr
func Sizeof(x ArbitraryType) uintptr
通过分析发现,这三个函数的参数均是ArbitraryType类型,就是接受任何类型的变量。 unsafe中,通过这两个个兼容万物的类型,将其他类型都转换过来,然后通过这三个函数,分别能取长度,偏移量,对齐字节数,就可以在内存地址映射中,来回游走。放在c语言中,是不是,只要给你一个起始地址,你就一下子干到底!!!在golang中,通过unsafe包,你也可以尽情的去放纵。 另外提一点: uintptr这个类型,在golang中,字节长度也是与int一致。通常Pointer不能参与运算,比如你要在某个指针地址上加上一个偏移量,Pointer是不能做这个运算的,那么谁可以呢?就是uintptr类型了,只要将Pointer类型转换成uintptr类型,做完加减法后,转换成Pointer,通过*操作,取值,修改值,随意。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |