文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
unsafe 包
unsafe
是编译器已知的内置包,可以通过导入路径 unsafe
访问包内容,提供 unsafe
包目的是支持底层编程(包括操作非 Go 类型的数据结构)。使用 unsafe
包必须自己保证类型安全而且它有可能破坏程序的移植性。 unsafe
包提供了以下接口:
package unsafe
type ArbitraryType int // 任意一个 Go 类型;它不是一个具体的类型。
type Pointer *ArbitraryType
func Alignof(variable ArbitraryType) uintptr
func Offsetof(selector ArbitraryType) uintptr
func Sizeof(variable ArbitraryType) uintptr
Pointer
是一个指针类型,但是不能解引用 Pointer
的值。所有底层类型 uintptr
的指针和值都能转换成 Pointer
类型,反之亦然。 Pointer
和 uintptr
之间的转换效果由具体实现定义。
var f float64
bits = *(*uint64)(unsafe.Pointer(&f))
type ptr unsafe.Pointer
bits = *(*uint64)(ptr(&f))
var p ptr = nil
假设变量 v 由 var v = x
定义。 Alignof
以表达式 x 作为参数并返回 x 的对齐字节数。 Sizeof
以表达式 x 作为参数并返回 x 的大小。
函数 Offsetof
以选择器 s.f
( s 或者 *s 结构体中的 f 字段)作为参数,返回字段相对结构体首地址的位置。如果 f 是一个嵌入字段,那 f 必须可以直接访问(不能通过指针进行间接访问)。对于结构体 s 的 f 字段:
uintptr(unsafe.Pointer(&s)) + unsafe.Offsetof(s.f) == uintptr(unsafe.Pointer(&s.f))
计算机的体系结构要求对齐内存地址(对于一个变量的地址有多种因素影响对齐)。 Alignof
函数获取一个人和类型的表达式并返回变量对齐的字节数。对于变量 x:
uintptr(unsafe.Pointer(&x)) % unsafe.Alignof(x) == 0
编译时 uintptr
类型常量表达式会调用 Alignof
, Offsetof
,和 Sizeof
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论