golang中unsafe包浅析

来源:互联网 发布:java打包package 编辑:程序博客网 时间:2024/06/03 15:10

unsafe内容介绍

func Alignof(x ArbitraryType) uintptrfunc Offsetof(x ArbitraryType) uintptrfunc Sizeof(x ArbitraryType) uintptrtype ArbitraryType inttype Pointer *ArbitraryType

这个包中,只提供了3个函数,两个类型。就这么少的量,却有着超级强悍的功能。学过C语言的都可能比较清楚,通过指针,知道变量在内存中占用的字节数,就可以通过指针加偏移量的操作,在地址中,修改,访问变量的值。在golang中,怎么去实现这么疯狂的操作呢?就得靠unsafe包了。

两个类型简介

type ArbitraryType inttype 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类型长度,在内存中占用的字节数是一样的哟

提示:
ArbitraryType类型的变量也可以是指针。所以,千万不要死磕type后边的那个int。

三个函数介绍

func Alignof(x ArbitraryType) uintptrfunc Offsetof(x ArbitraryType) uintptrfunc Sizeof(x ArbitraryType) uintptr

通过分析发现,这三个函数的参数均是ArbitraryType类型,就是接受任何类型的变量。
1. Alignof返回变量对齐字节数量
2. Offsetof返回变量指定属性的偏移量,这个函数虽然接收的是任何类型的变量,但是这个又一个前提,就是变量要是一个struct类型,且还不能直接将这个struct类型的变量当作参数,只能将这个struct类型变量的属性当作参数。
3. Sizeof 返回变量在内存中占用的字节数,切记,如果是slice,则不会返回这个slice在内存中的实际占用长度。

unsafe中,通过这两个个兼容万物的类型,将其他类型都转换过来,然后通过这三个函数,分别能取长度,偏移量,对齐字节数,就可以在内存地址映射中,来回游走。放在c语言中,是不是,只要给你一个起始地址,你就一下子干到底!!!在golang中,通过unsafe包,你也可以尽情的去放纵。

另外提一点:
uintptr这个类型,在golang中,字节长度也是与int一致。通常Pointer不能参与运算,比如你要在某个指针地址上加上一个偏移量,Pointer是不能做这个运算的,那么谁可以呢?就是uintptr类型了,只要将Pointer类型转换成uintptr类型,做完加减法后,转换成Pointer,通过*操作,取值,修改值,随意。

0 0