在Go中,通过&获取变量地址并转换为unsafe.Pointer可用于底层操作,如类型擦除、指针运算和结构体字段访问。示例:var x int = 42,ptr := unsafe.Pointer(&x),可转为int进行修改。unsafe.Pointer支持四种合法转换:任意指针与unsafe.Pointer互转,uintptr与unsafe.Pointer互转。关键规则是不能直接将unsafe.Pointer转为普通类型,必须通过uintptr中转。常见错误如int(unsafe.Pointer(&x))会导致编译失败,正确做法是addr := uintptr(unsafe.Pointer(&x))。指针运算时,结合unsafe.Offsetof可访问结构体字段,如agePtr := (int)(unsafe.Pointer(uintptr(unsafe.Pointer(&p)) + unsafe.Offsetof(p.Age)))。使用时需注意:避免长期保存unsafe.Pointer,防止GC移动对象;确保类型内存布局一致;不假设跨平台对齐;不引用已失效的栈变量。核心是掌握转换链:typed pointer → unsafe.Pointer → uintptr用于计算,反向用于访问,遵循规则可安全高效使用unsafe包。

在Go语言中,获取变量地址并进行
unsafe.Pointer
unsafe
任何变量都可以通过取地址符
&
unsafe.Pointer
将
int
unsafe.Pointer
*int
var x int = 42
ptr := unsafe.Pointer(&x)
intPtr := (*int)(ptr)
*intPtr = 100 // 修改原变量
此时
ptr
立即学习“go语言免费学习笔记(深入)”;
Go规定
unsafe.Pointer
unsafe.Pointer
unsafe.Pointer
uintptr
unsafe.Pointer
unsafe.Pointer
uintptr
不能直接在
unsafe.Pointer
// 错误:不能把 unsafe.Pointer 直接当整数用
num := int(unsafe.Pointer(&x)) // 编译失败
正确做法是先转
uintptr
addr := uintptr(unsafe.Pointer(&x))
当处理结构体或数组时,可通过
uintptr
例如,访问结构体第二个字段:
type Person struct {
Name string
Age int
}
p := Person{Name: "Tom", Age: 25}
agePtr := (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&p)) + unsafe.Offsetof(p.Age)))
fmt.Println(*agePtr) // 输出 25
这里
unsafe.Offsetof(p.Age)
Age
使用
unsafe.Pointer
unsafe.Pointer
基本上就这些。只要理解指针转换链:
typed pointer → unsafe.Pointer → uintptr
uintptr → unsafe.Pointer → typed pointer
以上就是Golang获取变量地址 unsafe.Pointer转换技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号