Open9
reflectパッケージのソースコードを読む
ValueとTypeがメインの型
Valueは型とポインタとフラグを持つ
type Value struct {
typ *rtype
ptr unsafe.Pointer
flag
}
*rtype
はType
インタフェースを実装するやつ。
flagindir
フラグがオンの場合はデータとしてのポインタが直に入ってる。それ以外は値へのポインタ。
// Pointer-valued data or, if flagIndir is set, pointer to data.
// Valid when either flagIndir is set or typ.pointers() is true.
ptr unsafe.Pointer
flag
フィールドはなぜか埋め込み
// flag holds metadata about the value.
// The lowest bits are flag bits:
// - flagStickyRO: obtained via unexported not embedded field, so read-only
// - flagEmbedRO: obtained via unexported embedded field, so read-only
// - flagIndir: val holds a pointer to the data
// - flagAddr: v.CanAddr is true (implies flagIndir)
// - flagMethod: v is a method value.
// The next five bits give the Kind of the value.
// This repeats typ.Kind() except for method values.
// The remaining 23+ bits give a method number for method values.
// If flag.kind() != Func, code can assume that flagMethod is unset.
// If ifaceIndir(typ), code can assume that flagIndir is set.
下位4ビットがフラグ
-
flagStickyRO
: 非公開かつ埋め込みではないフィールド(読み込み専用) -
flagEmbedRO
: 非公開の埋め込みフィールド(読み込み専用) -
flagIndir
: ポインタかどうか