unsafe
1 unsafe包简介
unsafe包顾名思义,是非安全的,是面向编译器的一个包,使用它要特别小心,unsafe包可以绕过Go的内存机制,对内存进行读写;
2 unsafe 主要变量
- unsafe.Pointer
type ArbitraryType int
type Pointer *ArbitraryType
ArbitraryType是int的别名,在go中赋予特殊的含义,指代任意一种类型,pointer是一种特殊的指针类型,可以存储任意一种指针类型的值,可以看做pointer是不同指针类型转换的中间层:
*T1 <-> Pointer <-> *T2
- uintptr
uintptr是go 内置的一个类型,可以存储任何类型指针的整型,指针之间不可以直接进行运算,但是可以通过uintptr进行指针运算
3 四个规则
- 任何指针都可以转换为unsafe.Pointer
- unsafe.Pointer可以转换为任何指针
- uintptr可以转换为unsafe.Pointer
- unsafe.Pointer可以转换为uintptr
4 unsafe包的主要函数
1 SizeOf 函数-》 返回一个类型占用的内存大小,是类型占用的字节数,不是该类型存储的内容大小,go里面的int和int64都是用8个字节存储;
b := true
i8 := int8(111)
i16 := int16(11)
i32 := int32(111111111)
i64 := int64(1)
i := 1
s := "s"
fmt.Println(unsafe.Sizeof(b))
fmt.Println(unsafe.Sizeof(i8))
fmt.Println(unsafe.Sizeof(i16))
fmt.Println(unsafe.Sizeof(i32))
fmt.Println(unsafe.Sizeof(i64))
fmt.Println(unsafe.Sizeof(i))
fmt.Println(unsafe.Sizeof(s))
1
1
2
4
8
8
16
2 Alignof() -> 返回类型的对齐值
3 Offsetof() -> 只适用于struct结构体中的字段相对于结构体的内存位置偏移量。结构体的第一个字段的偏移量都是0.
4 unsafe包用法
4.1 指针类型转换
4.2 修改结构体未导出字段
引用:
[https://www.flysnow.org/2017/07/06/go-in-action-unsafe-pointer.html]
https://www.jianshu.com/p/c394436ec9e5
网友评论