概述
编译器内置包unsafe,可以通过导入路径 "unsafe "访问,为低级编程提供设施,包括违反类型系统的操作。使用unsafe的包必须手动审查其类型安全,并且可能无法移植。
Pointer
Pointer是一个指针类型,但Pointer的值不能被解除引用。任何底层类型uintptr的指针或值都可以被转换为底层类型Pointer的类型,反之亦然。在Pointer和uintptr之间转换的效果是实现定义的。
Alignof、Sizeof
函数Alignof和Sizeof接收任何类型的表达式x,并分别返回假设变量v的对齐方式或大小(v相当于var v = x声明)
uintptr(unsafe.Pointer(&x)) % unsafe.Alignof(x) == 0
Offsetof
函数Offsetof接收一个(可能是括号内的)选择器s.f,表示由s或 * s表示的结构中的一个字段f,并返回相对于该结构地址的字段偏移量(字节)。如果f是一个嵌入式字段,它必须可以通过结构的字段在没有指针间接的情况下到达。对于一个带有字段f的结构s
uintptr(unsafe.Pointer(&s)) + unsafe.Offsetof(s.f) == uintptr(unsafe.Pointer(&s.f))
Add
函数 Add 将 len 添加到 ptr 并返回更新的指针 unsafe.Pointer(uintptr(ptr) + uintptr(len)) 。len参数必须是整数类型或一个未定型的常数。一个常数len参数必须可以用int类型的值表示;如果它是一个未定型的常数,它被赋予int类型。Pointer的有效使用规则仍然适用。
Slice
函数 Slice 返回一个切片,其底层数组从 ptr 开始,其长度和容量为 len。Slice(ptr, len)等同于
(*[len]ArbitraryType)(unsafe.Pointer(ptr))[:]
SliceData
SliceData函数返回一个指向slice参数的底层数组的指针。如果切片的容量cap(slice)不为零,该指针为&slice[:1][0]。如果slice是空的,结果是空的。否则,它是一个指向未指定的内存地址的非空指针。
String
函数 String 返回一个字符串值,其基础字节从 ptr 开始,其长度为 len。对 ptr 和 len 参数的要求与函数 Slice 相同。如果len为零,结果是空字符串""。由于Go字符串是不可改变的,传递给String的字节不能在事后被修改。
StringData
函数StringData返回一个指向str参数的基础字节的指针。对于空的字符串,返回值是未指定的,可能是nil。由于Go字符串是不可改变的,所以StringData返回的字节不能被修改。