Go unsafe:内存操作与类型转换
了解unsafe包的危险与强大,学习指针运算、类型转换和内存布局操作。 · 难度:入门 · +15XP
unsafe包概述
unsafe包提供了绕过Go类型安全的方法,常用于系统编程、性能优化和与C代码交互。使用需谨慎,可能导致程序崩溃或不可移植。
核心操作
// 获取指针偏移
var x struct {
a int32
b int64
}
ptr := unsafe.Pointer(&x)
// 计算b字段的偏移
bPtr := unsafe.Pointer(uintptr(ptr) + unsafe.Offsetof(x.b))
*(*int64)(bPtr) = 42类型转换
// 将float64转换为uint64位模式
f := 3.14
bits := *(*uint64)(unsafe.Pointer(&f))| 函数/类型 | 说明 |
|---|---|
| Pointer | 通用指针类型 |
| Offsetof | 字段偏移量 |
| Sizeof | 类型大小 |
| Alignof | 对齐要求 |
安全警告
1. 指针运算后可能指向无效内存
2. 依赖内存布局的代码不可移植
3. GC可能移动对象,导致指针失效
练习提示
使用unsafe.Pointer和uintptr访问结构体字段,但注意不要存储uintptr,因为GC无法跟踪它。