Open9

reflectパッケージのソースコードを読む

tenntenntenntenn

Valueは型とポインタとフラグを持つ

type Value struct {
	typ *rtype
	ptr unsafe.Pointer
	flag
}
tenntenntenntenn

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
tenntenntenntenn
// 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.
tenntenntenntenn

下位4ビットがフラグ

  • flagStickyRO: 非公開かつ埋め込みではないフィールド(読み込み専用)
  • flagEmbedRO: 非公開の埋め込みフィールド(読み込み専用)
  • flagIndir: ポインタかどうか