为什么不安全.Sizeof被认为是不安全的?

Jos*_*osh 5 unsafe go

考虑以下:

import (
    "log"
    "unsafe"
)

type Foo struct {
    Bar int32
}

func main() {
    log.Println(int(unsafe.Sizeof(Foo{})))
}
Run Code Online (Sandbox Code Playgroud)

为什么确定变量的大小被认为是不安全的,以及不安全包的一部分?我不明白为什么获取任何类型的大小是一个不安全的操作,或者使用什么机制来确定其大小,这是必要的.

我还想知道是否有任何替代不安全包来确定已知结构的大小.

How*_*owl 7

因为在Go中你需要调用sizeof,这通常意味着你直接操作内存,你永远不需要这样做.

如果你来从C的世界里,你可能会经常使用了sizeof一起malloc创建一个可变长度的阵列-但这不应沉迷,需要在这里你可以简单make([]Foo, 10).在Go中,运行时会处理要分配的内存量.

你不应该害怕调用unsafe.Sizeof它真正有意义的地方 - 但你应该问自己是否真的需要它.

即使您正在使用它来编写二进制格式,通常最好自己计算所需的字节数,或者使用reflect以下方法动态生成它:

  • 调用unsafe.Sizeofstruct还将包括为填充添加的字节数.
  • 在动态大小的结构(即切片,字符串)上调用它将产生其标题的长度 - 您应该调用它len().

使用unsafeuintptr,intuint以确定是否你在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)