golang で unsafe パッケージを使わざるを得ないケースがあるけれど、具体的にどういう場合に unsafe が本当に unsafe なのかは、あまり出てこない。
具体例を思いついたのでメモしておく。
func Danger(buf [4]byte) *uint32 {
return (*uint32)(unsafe.Pointer(&buf))
}
func Safe(buf [4]byte) *uint32 {
var ret uint32
ret = *(*uint32)(unsafe.Pointer(&buf))
return &ret
}
引数の buf がメモリ解放された後で、戻り値にアクセスできるかどうかを考えると、Danger
がダメだとわかる。
ま、このケースはそもそもポインタ返すなというのもあるけれど。構造体だったらうっかりやる人もいるかもよ?パフォーマンスガーとか言いながら。