import "unsafe"

Goプログラムの型安全性を回避する操作を扱っています。

パッケージファイル

unsafe.go

Alignof関数

func Alignof(v ArbitraryType) int

Alignofは、値vのアライメントを返します。この値は、式「vの型を持った変数のアドレス % m == 0」が常に成り立つようなmの値の最大値です。vがobj.f形式のときは、構造体オブジェクトobj内のフィールドfのアライメントを返します。

Offsetof関数

func Offsetof(v ArbitraryType) int

Offsetofは、構造体内のオフセットを返します。vは「構造体の値.フィールド」形式でなければなりません。言い換えると、構造体の先頭とフィールドの先頭間のバイト数を返します。

Reflect関数

func Reflect(i interface{}) (typ interface{}, addr uintptr)

Reflectは、インタフェース値をその型にアンパックした値と、内部値のコピーのアドレスを返します。

Sizeof関数

func Sizeof(v ArbitraryType) int

Sizeofは、値vが使用するサイズをバイト数で返します。この返されるサイズは値の「トップレベル」のサイズだけです。たとえば、vがスライスのときはスライスが参照しているメモリのサイズではなく、スライス記述子のサイズを返します。

Typeof関数

func Typeof(i interface{}) (typ interface{})

Typeofは、インタフェース値の型をruntime.Typeで返します。

Unreflect関数

func Unreflect(typ interface{}, addr uintptr) (ret interface{})

Unreflectは、Reflectの逆です。型とポインタから、それらの内容を持った空インタフェース値を返します。typはランタイム型へのポインタを含んでいるとみなされます。interface{}内の型情報は無視されるため、たとえば *reflect.StructTypeや*runtime.StructTypeをtypに渡すことができます。

ArbitraryType型

ArbitraryTypeは、実際にはunsafeパッケージの一部ではなく、ドキュメントのためだけにここに記載されています。これはGo言語式の任意の型を表します。

type ArbitraryType int

Pointer型

Pointerは、任意の型へのポインタを表します。これには他の型では使えない、Pointer型だけが利用できる3つの特殊な操作を持っています。

1) どんな型のポインタでもPointerに変換可能。
2) uintptrは、Pointerに変換可能。
3) Pointerは、uintptrに変換可能。

したがって、Pointerはプログラムが型システムを無効にして任意にメモリの読み書きを行うことを許可します。これは最大の注意を払って行う必要があります。

type Pointer *ArbitraryType

New関数

func New(typ interface{}) Pointer

Newは、与えられた型の値を新たに割り当てて、割り当てたメモリへのポインタを返します。typはランタイム型へのポインタを保持しているとみなされます。呼び出し元は直接unsafe.Newを実行する代わりに、reflect.MakeZeroを使うべきです。

NewArray関数

func NewArray(typ interface{}, n int) Pointer

NewArrayは、与えられた型で要素数がnである配列を割り当てて、そのポインタを返します。typはランタイム型へのポインタを保持しているとみなされます。呼び出し元は直接unsafe.NewArrayを実行する代わりに、reflect.MakeSliceを使うべきです。