考虑以下:
import (
"log"
"unsafe"
)
type Foo struct {
Bar int32
}
func main() {
log.Println(int(unsafe.Sizeof(Foo{})))
}
Run Code Online (Sandbox Code Playgroud)
为什么确定变量的大小被认为是不安全的,以及不安全包的一部分?我不明白为什么获取任何类型的大小是一个不安全的操作,或者使用什么机制来确定其大小,这是必要的.
我还想知道是否有任何替代不安全包来确定已知结构的大小.
因为在Go中你需要调用sizeof,这通常意味着你直接操作内存,你永远不需要这样做.
如果你来从C的世界里,你可能会经常使用了sizeof一起malloc创建一个可变长度的阵列-但这不应沉迷,需要在这里你可以简单make([]Foo, 10).在Go中,运行时会处理要分配的内存量.
你不应该害怕调用unsafe.Sizeof它真正有意义的地方 - 但你应该问自己是否真的需要它.
即使您正在使用它来编写二进制格式,通常最好自己计算所需的字节数,或者使用reflect以下方法动态生成它:
unsafe.Sizeofstruct还将包括为填充添加的字节数.len().使用unsafe上uintptr,int或uint以确定是否你在32位或64位运行?您通常可以通过指定int64实际需要支持大于2 ^ 31的数字来避免这种情况.或者,如果您确实需要检测它,您还有许多其他选项,例如构建标记或类似的东西:
package main
import (
"fmt"
)
const is32bit = ^uint(0) == (1 << 32) - 1
func main() {
fmt.Println(is32bit)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |