返回介绍

unsafe 包

发布于 2024-10-12 12:51:56 字数 1599 浏览 0 评论 0 收藏 0

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 类型,反之亦然。 Pointeruintptr 之间的转换效果由具体实现定义。

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 类型常量表达式会调用 AlignofOffsetof ,和 Sizeof

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文