...

パッケージ reflect

import "reflect"
概要
目次

概要 ▾

reflect パッケージは,ランタイムリフレクションを実装し,プログラムが任意の型のオブジェクトを操作するのを可能にします。 典型的な使用例は,interface{} 型の値を取り, TypeOf を呼び出して,動的な型を取得します。

ValueOf を呼び出すと,ランタイムデータを表す Value が返されます。 Zero は Type を取り,その型のゼロ値を表す Value を返します。

Go のリフレクションの概要については, "リフレクションの法則" を参照してください。 https://golang.org/doc/articles/laws_of_reflection.html

目次 ▾

func Copy(dst, src Value) int
func DeepEqual(x, y interface{}) bool
func Swapper(slice interface{}) func(i, j int)
type ChanDir
    func (d ChanDir) String() string
type Kind
    func (k Kind) String() string
type MapIter
    func (it *MapIter) Key() Value
    func (it *MapIter) Next() bool
    func (it *MapIter) Value() Value
type Method
type SelectCase
type SelectDir
type SliceHeader
type StringHeader
type StructField
type StructTag
    func (tag StructTag) Get(key string) string
    func (tag StructTag) Lookup(key string) (value string, ok bool)
type Type
    func ArrayOf(count int, elem Type) Type
    func ChanOf(dir ChanDir, t Type) Type
    func FuncOf(in, out []Type, variadic bool) Type
    func MapOf(key, elem Type) Type
    func PtrTo(t Type) Type
    func SliceOf(t Type) Type
    func StructOf(fields []StructField) Type
    func TypeOf(i interface{}) Type
type Value
    func Append(s Value, x ...Value) Value
    func AppendSlice(s, t Value) Value
    func Indirect(v Value) Value
    func MakeChan(typ Type, buffer int) Value
    func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value
    func MakeMap(typ Type) Value
    func MakeMapWithSize(typ Type, n int) Value
    func MakeSlice(typ Type, len, cap int) Value
    func New(typ Type) Value
    func NewAt(typ Type, p unsafe.Pointer) Value
    func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)
    func ValueOf(i interface{}) Value
    func Zero(typ Type) Value
    func (v Value) Addr() Value
    func (v Value) Bool() bool
    func (v Value) Bytes() []byte
    func (v Value) Call(in []Value) []Value
    func (v Value) CallSlice(in []Value) []Value
    func (v Value) CanAddr() bool
    func (v Value) CanInterface() bool
    func (v Value) CanSet() bool
    func (v Value) Cap() int
    func (v Value) Close()
    func (v Value) Complex() complex128
    func (v Value) Convert(t Type) Value
    func (v Value) Elem() Value
    func (v Value) Field(i int) Value
    func (v Value) FieldByIndex(index []int) Value
    func (v Value) FieldByName(name string) Value
    func (v Value) FieldByNameFunc(match func(string) bool) Value
    func (v Value) Float() float64
    func (v Value) Index(i int) Value
    func (v Value) Int() int64
    func (v Value) Interface() (i interface{})
    func (v Value) InterfaceData() [2]uintptr
    func (v Value) IsNil() bool
    func (v Value) IsValid() bool
    func (v Value) IsZero() bool
    func (v Value) Kind() Kind
    func (v Value) Len() int
    func (v Value) MapIndex(key Value) Value
    func (v Value) MapKeys() []Value
    func (v Value) MapRange() *MapIter
    func (v Value) Method(i int) Value
    func (v Value) MethodByName(name string) Value
    func (v Value) NumField() int
    func (v Value) NumMethod() int
    func (v Value) OverflowComplex(x complex128) bool
    func (v Value) OverflowFloat(x float64) bool
    func (v Value) OverflowInt(x int64) bool
    func (v Value) OverflowUint(x uint64) bool
    func (v Value) Pointer() uintptr
    func (v Value) Recv() (x Value, ok bool)
    func (v Value) Send(x Value)
    func (v Value) Set(x Value)
    func (v Value) SetBool(x bool)
    func (v Value) SetBytes(x []byte)
    func (v Value) SetCap(n int)
    func (v Value) SetComplex(x complex128)
    func (v Value) SetFloat(x float64)
    func (v Value) SetInt(x int64)
    func (v Value) SetLen(n int)
    func (v Value) SetMapIndex(key, elem Value)
    func (v Value) SetPointer(x unsafe.Pointer)
    func (v Value) SetString(x string)
    func (v Value) SetUint(x uint64)
    func (v Value) Slice(i, j int) Value
    func (v Value) Slice3(i, j, k int) Value
    func (v Value) String() string
    func (v Value) TryRecv() (x Value, ok bool)
    func (v Value) TrySend(x Value) bool
    func (v Value) Type() Type
    func (v Value) Uint() uint64
    func (v Value) UnsafeAddr() uintptr
type ValueError
    func (e *ValueError) Error() string
Bugs

Kind
MakeFunc
StructOf
StructTag
StructTag.Lookup
TypeOf

パッケージファイル

deepequal.go makefunc.go swapper.go type.go value.go

func Copy

func Copy(dst, src Value) int

Copy は, dst がいっぱいになるか, src が使い果たされるまで, src の内容を dst にコピーします。 コピーされた要素の数を返します。 Dst と src はそれぞれ Slice または Array の種類を持ち, dst と src は同じ要素型を持つ必要があります。

特別な場合として, dst の要素型が kind Uint8 であれば, src は kind String を持つことができます。

func DeepEqual

func DeepEqual(x, y interface{}) bool

DeepEqual は, x と y が "深く等しい" かどうかを報告し,次のように定義します。 次のいずれかの場合に,同じ型の 2 つの値は非常に等しくなります。 特殊型の値は決して深く等しくなりません。

対応する要素が深く等しいとき,配列値は深く等しいです。

対応するフィールド (エクスポート済みと未エクスポートの両方) が完全に等しい場合,構造体の値は完全に等しいです。

両方とも nil の場合, Func 値は深く等しくなります。 そうでなければ,それらは深く平等ではありません。

インターフェース値が深く等しい具象値を保持している場合,インターフェース値は深く等しくなります。

次のすべてが当てはまる場合,マップ値は完全に等しくなります。 両方とも nil または両方とも非 nil で,長さが同じで,それらが同じマップオブジェクトまたは対応するキー (Go の等さを使用して一致) が深く等しい値の場合のいずれかです。

Go の == 演算子を使用してそれらが等しい場合,またはそれらが深く等しい値を指している場合,ポインタ値は深く等しくなります。

スライス値は,以下のすべての条件を満たす場合,深く等しくなります。 両方とも nil または両方とも non-nil であり,長さが同じで,どちらも同じ基本配列の同じ初期エントリを指している (つまり,&x[0] == &y[0]),または対応する要素 (長さまで) が深く等しい場合です。 nil 以外の空のスライスと nil スライス (たとえば, []byte{} と []byte(nil)) は深く等しくありません。

他の値 (数値,ブール値,文字列,チャンネル) は, Go の == 演算子を使用して等しい場合,深く等しくなります。

一般に, DeepEqual は Go の == 演算子の再帰的緩和です。 ただし,このアイデアを全くの不整合なく実装することは不可能です。 具体的には,値が func 型 (一般に比較不可能) であるため,または浮動小数点 NaN 値 (浮動小数点比較ではそれ自体と等しくない) であるため,またはそのような値を含む配列,構造体,またはインターフェースであるためです。 一方,ポインタ値は,そのような問題のある値を指していたり​​,含んでいたりしても,常に自分自身と等しくなります。 これは, Go の == 演算子を使用して等しさを比較するためです。 DeepEqual は,スライスとマップに同じショートカットが適用されるように定義されています。 x と y が同じスライスまたは同じマップの場合,内容に関係なく,それらは深く等しくなります。

DeepEqual がデータ値をトラバースすると,サイクルが見つかる可能性があります。 DeepEqual が以前に比較された 2 つのポインタ値を比較する 2 回目以降は,それらが指す値を調べるのではなく,値を等しいと見なします。 これにより, DeepEqual は確実に終了します。

func Swapper 1.8

func Swapper(slice interface{}) func(i, j int)

Swapper は渡されたスライスの要素を交換する関数を返します。

渡されたインターフェースがスライスでない場合,スワッパーはパニックを起こします。

type ChanDir

ChanDir はチャンネル型の方向を表します。

type ChanDir int
const (
    RecvDir ChanDir             = 1 << iota // <-chan
    SendDir                                 // chan<-
    BothDir = RecvDir | SendDir             // chan
)

func (ChanDir) String

func (d ChanDir) String() string

type Kind

Kind は,型が表す型の特定の種類を表します。 ゼロ Kind は有効な種類ではありません。

type Kind uint
const (
    Invalid Kind = iota
    Bool
    Int
    Int8
    Int16
    Int32
    Int64
    Uint
    Uint8
    Uint16
    Uint32
    Uint64
    Uintptr
    Float32
    Float64
    Complex64
    Complex128
    Array
    Chan
    Func
    Interface
    Map
    Ptr
    Slice
    String
    Struct
    UnsafePointer
)

コード:

for _, v := range []interface{}{"hi", 42, func() {}} {
    switch v := reflect.ValueOf(v); v.Kind() {
    case reflect.String:
        fmt.Println(v.String())
    case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
        fmt.Println(v.Int())
    default:
        fmt.Printf("unhandled kind %s", v.Kind())
    }
}

出力:

hi
42
unhandled kind func

func (Kind) String

func (k Kind) String() string

String は k の名前を返します。

type MapIter 1.12

MapIter は,マップをまたぐための反復子です。 Value.MapRange を参照してください。

type MapIter struct {
    // エクスポートされていないフィールドがあります
}

func (*MapIter) Key 1.12

func (it *MapIter) Key() Value

Key は,イテレータの現在のマップエントリのキーを返します。

func (*MapIter) Next 1.12

func (it *MapIter) Next() bool

Next はマップイテレータを進め,別のエントリがあるかどうかを報告します。 イテレータが使い果たされると false を返します。 それ以降の Key, Value ,または Next への呼び出しはパニックします。

func (*MapIter) Value 1.12

func (it *MapIter) Value() Value

Value は,イテレータの現在のマップエントリの値を返します。

type Method

Method は 1 つのメソッドを表します。

type Method struct {
    // Name はメソッド名です。
    // PkgPath は,小文字の (未エクスポートの) メソッド名を修飾するパッケージパスです。
    // 大文字の (エクスポートされた) メソッド名の場合は空です。
    // PkgPath と Name の組み合わせは,メソッドセット内のメソッドを一意に識別します。
    // https://golang.org/ref/spec#Uniqueness_of_identifiers を参照してください。
    Name    string
    PkgPath string

    Type  Type  // メソッドの種類
    Func  Value // 最初の引数として受信機を持つ func
    Index int   // Type.Method のインデックス
}

type SelectCase 1.1

SelectCase は,選択操作における 1 つのケースを表します。 ケースの種類は,通信方向である Dir によって異なります。

Dir が SelectDefault の場合,ケースはデフォルトのケースを表します。 Chan と Send はゼロ値でなければなりません。

Dir が SelectSend の場合,ケースは送信操作を表します。 通常, Chan の基本値はチャンネルでなければならず, Send の基本値はチャンネルの要素型に割り当て可能でなければなりません。 特別な場合として,もし Chan がゼロ値であるならば,ケースは無視され,そしてフィールド送信もまた無視されそしてゼロまたはゼロ以外のいずれかであり得る。

Dir が SelectRecv の場合,ケースは受信操作を表します。 通常, Chan の内部の値はチャンネルでなければならず, Send はゼロ値でなければなりません。 Chan がゼロ値の場合,大文字と小文字の区別は無視されますが,送信は依然としてゼロ値でなければなりません。 受信操作が選択されると,受信した値が Select によって返されます。

type SelectCase struct {
    Dir  SelectDir // ケースの方向
    Chan Value     // 使用するチャンネル (送信または受信用)
    Send Value     // 送信する値 (送信用)
}

type SelectDir 1.1

SelectDir は,選択ケースの通信方向を表します。

type SelectDir int
const (
    SelectSend    SelectDir // case Chan <- Send
    SelectRecv              // case <-Chan:
    SelectDefault           // default
)

type SliceHeader

SliceHeader はスライスのランタイム表現です。 安全にまたは移植して使用することはできず,その表現は将来のリリースで変更される可能性があります。 さらに, Data フィールドは,それが参照するデータがガベージコレクションされないことを保証するのに十分ではないので,プログラムは内部のデータへの別々の,正しく型付けされたポインタを保持しなければなりません。

type SliceHeader struct {
    Data uintptr
    Len  int
    Cap  int
}

type StringHeader

StringHeader は,文字列の実行時表現です。 安全にまたは移植して使用することはできず,その表現は将来のリリースで変更される可能性があります。 さらに, Data フィールドは,それが参照するデータがガベージコレクションされないことを保証するのに十分ではないので,プログラムは内部のデータへの別々の,正しく型付けされたポインタを保持しなければなりません。

type StringHeader struct {
    Data uintptr
    Len  int
}

type StructField

StructField は,構造体内の 1 つのフィールドを記述します。

type StructField struct {
    // Name はフィールド名です。
    Name string
    // PkgPath は,小文字 (未エクスポート) のフィールド名を修飾するパッケージパスです。
    // 大文字の (エクスポートされた) フィールド名の場合は空です。
    // https://golang.org/ref/spec#Uniqueness_of_identifiers を参照してください。
    PkgPath string

    Type      Type      // フィールド型
    Tag       StructTag // フィールドタグ文字列
    Offset    uintptr   // 構造体内のオフセット (バイト)
    Index     []int     // Type.FieldByIndex のインデックスシーケンス
    Anonymous bool      // 埋め込みフィールドです
}

type StructTag

StructTag は,構造体フィールド内のタグ文字列です。

慣例により,タグ文字列は,オプションでスペースで区切られた key:"value" のペアの連結です。 各キーは,スペース (U+0020 ' ') ,引用符 (U+0022 '"') ,およびコロン (U+003A ':') 以外の非制御文字で構成される,空ではない文字列です。 各値は,U+0022 '"' 文字でくくられる Go 文字列リテラル構文を使用します。

type StructTag string

コード:

type S struct {
    F string `species:"gopher" color:"blue"`
}

s := S{}
st := reflect.TypeOf(s)
field := st.Field(0)
fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"))

出力:

blue gopher

func (StructTag) Get

func (tag StructTag) Get(key string) string

Get は,タグ文字列内の key に関連付けられている値を返します。 タグにそのようなキーがない場合, Get は空の文字列を返します。 タグが従来の形式でない場合, Get によって返される値は指定されていません。 タグが明示的に空の文字列に設定されているかどうかを判断するには, Lookup を使用します。

func (StructTag) Lookup 1.7

func (tag StructTag) Lookup(key string) (value string, ok bool)

Lookup は,タグ文字列内の key に関連付けられている値を返します。 キーがタグ内に存在する場合は,値 (空の場合もあります) が返されます。 それ以外の場合,戻り値は空の​​文字列になります。 ok 戻り値は,値がタグ文字列で明示的に設定されたかどうかを報告します。 タグが従来の形式でない場合, Lookup によって返される値は指定されていません。

コード:

type S struct {
    F0 string `alias:"field_0"`
    F1 string `alias:""`
    F2 string
}

s := S{}
st := reflect.TypeOf(s)
for i := 0; i < st.NumField(); i++ {
    field := st.Field(i)
    if alias, ok := field.Tag.Lookup("alias"); ok {
        if alias == "" {
            fmt.Println("(blank)")
        } else {
            fmt.Println(alias)
        }
    } else {
        fmt.Println("(not specified)")
    }
}

出力:

field_0
(blank)
(not specified)

type Type 1.4

Type は Go 型の表現です。

すべてのメソッドが型のすべての種類に適用されるわけではありません。 制限がある場合は,各メソッドのドキュメントに記載されています。 種類固有のメソッドを呼び出す前に, Kind メソッドを使用して型の種類を調べます。 型の種類に不適切なメソッドを呼び出すと,ランタイムパニックが発生します。

型の値は == 演算子のように比較可能なので,マップキーとして使用できます。 2 つの Type 値は,それらが同一の型を表す場合は等しくなります。

type Type interface {

    // Align は,メモリに割り当てられている場合,この型の値のアライメントをバイト単位で返します。
    Align() int

    // FieldAlign は,構造体のフィールドとして使用された場合,この型の値のアライメントをバイト単位で返します。
    FieldAlign() int

    // Method は,型のメソッドセット内の i 番目のメソッドを返します。
    // i が範囲 [0, NumMethod()) にない場合はパニックします。
    //
    // 非インターフェース型 T または *T の場合,返される Method の Type フィールドと Func フィールドは,最初の引数がレシーバである関数を表します。
    //
    // インターフェース型の場合,返される Method の Type フィールドはレシーバなしでメソッドのシグネチャを与え, Func フィールドは nil です。
    //
    // エクスポートされたメソッドのみがアクセス可能であり,辞書式順にソートされます。
    Method(int) Method

    // MethodByName は,その型のメソッドセット内のその名前のメソッドと,そのメソッドが見つかったかどうかを示すブール値を返します。
    //
    // 非インターフェース型 T または *T の場合,返される Method の Type フィールドと Func フィールドは,最初の引数がレシーバである関数を表します。
    //
    // インターフェース型の場合,返される Method の Type フィールドはレシーバなしでメソッドのシグネチャを与え, Func フィールドは nil です。
    MethodByName(string) (Method, bool)

    // NumMethod は,型のメソッドセット内のエクスポートされたメソッドの数を返します。
    NumMethod() int

    // Name は,定義された型のそのパッケージ内の型の名前を返します。
    // 他の (定義されていない) 型の場合は空の文字列を返します。
    Name() string

    // PkgPath は,定義された型のパッケージパス,つまり, "encoding/base64" のようにパッケージを一意に識別するインポートパスを返します。
    // 型が事前宣言されている (string,error) ,または定義されていない (*T, struct{}, []int, または A ,ここで A は未定義型のエイリアス) 場合,パッケージパスは空の文字列になります。
    PkgPath() string

    // Size は与えられた型の値を格納するのに必要なバイト数を返します。
    // unsafe.Sizeof に似ています。
    Size() uintptr

    // String は型の文字列表現を返します。
    // 文字列表現は,短縮されたパッケージ名 (例えば, "encoding/base64" の代わりに base64) を使用してもよく,型間で一意であることが保証されていない。
    // 型の同一性をテストするには,型を直接比較します。
    String() string

    // Kind はこの型の特定の種類を返します。
    Kind() Kind

    // Implements は,その型がインターフェース型 u を実装しているかどうかを報告します。
    Implements(u Type) bool

    // AssignableTo は,型の値が型 u に割り当て可能かどうかを報告します。
    AssignableTo(u Type) bool

    // ConvertibleTo は,型の値が型 u に変換可能かどうかを報告します。
    ConvertibleTo(u Type) bool

    // Comparable は,この型の値が比較可能かどうかを報告します。
    Comparable() bool

    // Bits は型のサイズをビット数で返します。
    // 型の種類がサイズあり,サイズなしの Int , Uint , Float , Complex のいずれでもない場合はパニックします。
    Bits() int

    // ChanDir はチャンネル型の方向を返します。
    // 型の種類が Chan でない場合はパニックします。
    ChanDir() ChanDir

    // IsVariadic は,関数型の最後の入力パラメータが "..." パラメータかどうかを報告します。
    // そうであれば, t.In(t.NumIn() - 1) は,パラメータの暗黙の実データ型 []T を返します。
    //
    // 具体的には, t が func(x int, y ... float64) を表す場合,
    //
    //	t.NumIn() == 2
    //	t.In(0) は "int" の reflect.Type です。
    //	t.In(1) は "[]float64" の reflect.Type です。
    //	t.IsVariadic() == true
    //
    // 型の種類が Func ではない場合, IsVariadic はパニックします。
    IsVariadic() bool

    // Elem は型の要素型を返します。
    // 型の種類が Array , Chan , Map , Ptr , Slice のいずれでもない場合はパニックします。
    Elem() Type

    // Field は構造体型の i 番目のフィールドを返します。
    // 型の種類が構造体でない場合はパニックします。
    // i が範囲 [0, NumField()) にない場合はパニックします。
    Field(i int) StructField

    // FieldByIndex は,インデックスシーケンスに対応する入れ子のフィールドを返します。
    // 各インデックス i に対して Field を連続して呼び出すことと同じです。
    // 型の種類が構造体でない場合はパニックします。
    FieldByIndex(index []int) StructField

    // FieldByName は,指定された名前とフィールドが見つかったかどうかを示すブール値を持つ構造体フィールドを返します。
    FieldByName(name string) (StructField, bool)

    // FieldByNameFunc は, match 関数を満たす名前と,フィールドが見つかったかどうかを示すブール値を持つ構造体フィールドを返します。
    //
    // FieldByNameFunc は,構造体自体のフィールドを,次に埋め込み構造体のフィールドを幅優先順に考慮し,match 関数を満たす 1 つ以上のフィールドを含む最も浅い入れ子の深さで停止します。
    // その深さにある複数のフィールドが match 関数を満たす場合,それらは互いにキャンセルし, FieldByNameFunc は一致を返しません。
    // この動作は,埋め込みフィールドを含む構造体での Go の名前検索の処理を反映しています。
    FieldByNameFunc(match func(string) bool) (StructField, bool)

    // In は,関数型の i 番目の入力パラメータの型を返します。
    // 型の種類が Func でない場合はパニックします。
    // i が範囲 [0, NumIn()) にない場合はパニックします。
    In(i int) Type

    // Key はマップ型のキー型を返します。
    // 型の種類が Map でない場合はパニックします。
    Key() Type

    // Len は配列型の長さを返します。
    // 型の種類が配列でない場合はパニックします。
    Len() int

    // NumField は構造体型のフィールド数を返します。
    // 型の種類が構造体でない場合はパニックします。
    NumField() int

    // NumIn は,関数型の入力パラメータ数を返します。
    // 型の種類が Func でない場合はパニックします。
    NumIn() int

    // NumOut は関数型の出力パラメータ数を返します。
    // 型の種類が Func でない場合はパニックします。
    NumOut() int

    // Out は,関数型の i 番目の出力パラメータの型を返します。
    // 型の種類が Func でない場合はパニックします。
    // i が範囲 [0, NumOut()) にない場合はパニックします。
    Out(i int) Type
    // contains filtered or unexported methods
}

func ArrayOf 1.5

func ArrayOf(count int, elem Type) Type

ArrayOf は,指定された数と要素型を持つ配列型を返します。 たとえば, t が int を表す場合, ArrayOf(5, t) は [5]int を表します。

結果の型が利用可能なアドレス空間よりも大きい場合, ArrayOf はパニックを起こします。

func ChanOf 1.1

func ChanOf(dir ChanDir, t Type) Type

ChanOf は与えられた方向と要素型でチャンネル型を返します。 たとえば, t が int を表す場合, ChanOf(RecvDir, t) は <-chan int を表します。

gc ランタイムは,チャンネル要素型に 64 kB の制限を課します。 t のサイズがこの制限以上であると, ChanOf はパニックを起こします。

func FuncOf 1.5

func FuncOf(in, out []Type, variadic bool) Type

FuncOf は,与えられた引数と結果の型を使って関数型を返します。 たとえば, k が int を表し, e が文字列を表す場合, FuncOf([]Type{k}, []Type{e}, false) は func(int) 文字列を表します。

可変個引数は,関数が可変個であるかどうかを制御します。 in[len(in)-1] がスライスを表さず,可変個が真の場合, FuncOf はパニックします。

func MapOf 1.1

func MapOf(key, elem Type) Type

MapOf は,指定されたキーと要素の型を持つマップ型を返します。 たとえば, k が int を表し, e が文字列を表す場合, MapOf(k, e) は map[int]string を表します。

キー型が有効なマップキー型ではない場合 (つまり, Go の == 演算子が実装されていない場合), MapOf はパニックします。

func PtrTo

func PtrTo(t Type) Type

PtrTo は要素 t を持つポインタ型を返します。 たとえば, t が Foo 型を表す場合, PtrTo(t) は *Foo を表します。

func SliceOf 1.1

func SliceOf(t Type) Type

SliceOf は,要素型 t を持つスライス型を返します。 たとえば, t が int を表す場合, SliceOf(t) は []int を表します。

func StructOf 1.7

func StructOf(fields []StructField) Type

StructOf は,フィールドを含む構造体型を返します。 Offset フィールドと Index フィールドは無視され,コンパイラによる場合と同様に計算されます。

StructOf は,現在,エクスポートされていない StructField を渡した場合,埋め込みフィールドおよびパニックのラッパーメソッドを生成しません。 これらの制限は将来のバージョンでは解除されるかもしれません。

コード:

typ := reflect.StructOf([]reflect.StructField{
    {
        Name: "Height",
        Type: reflect.TypeOf(float64(0)),
        Tag:  `json:"height"`,
    },
    {
        Name: "Age",
        Type: reflect.TypeOf(int(0)),
        Tag:  `json:"age"`,
    },
})

v := reflect.New(typ).Elem()
v.Field(0).SetFloat(0.4)
v.Field(1).SetInt(2)
s := v.Addr().Interface()

w := new(bytes.Buffer)
if err := json.NewEncoder(w).Encode(s); err != nil {
    panic(err)
}

fmt.Printf("value: %+v\n", s)
fmt.Printf("json:  %s", w.Bytes())

r := bytes.NewReader([]byte(`{"height":1.5,"age":10}`))
if err := json.NewDecoder(r).Decode(s); err != nil {
    panic(err)
}
fmt.Printf("value: %+v\n", s)

出力:

value: &{Height:0.4 Age:2}
json:  {"height":0.4,"age":2}
value: &{Height:1.5 Age:10}

func TypeOf

func TypeOf(i interface{}) Type

TypeOf は, i の動的型を表す反射型を返します。 i が nil インターフェース値の場合, TypeOf は nil を返します。

コード:

// インターフェース型は静的型付けにのみ使用されるので,インターフェース型 Foo のリフレクション Type を見つけるための一般的な方法は *Foo 値を使用することです。
writerType := reflect.TypeOf((*io.Writer)(nil)).Elem()

fileType := reflect.TypeOf((*os.File)(nil))
fmt.Println(fileType.Implements(writerType))

出力:

true

type Value

Value は, Go 値へのリフレクションインターフェースです。

すべてのメソッドがすべての種類の値に適用されるわけではありません。 制限がある場合は,各メソッドのドキュメントに記載されています。 種類固有のメソッドを呼び出す前に, Kind メソッドを使用して値の種類を調べます。 型の種類に不適切なメソッドを呼び出すと,ランタイムパニックが発生します。

ゼロ Value は値がないことを表します。 その IsValid メソッドは false を返し,その Kind メソッドは Invalid を返し,その String メソッドは "<invalid Value>" を返し,その他のすべてのメソッドはパニックします。 ほとんどの関数とメソッドは無効な値を決して返しません。 もしそうであれば,そのドキュメントは条件を明示的に述べています。

内部の Go の値を同等の直接操作のために平行に使用できるのであれば, Value は複数のゴルーチンによって平行に使用することができます。

2 つの値を比較するには, Interface メソッドの結果を比較します。 2 つの値に == を使用しても,それらが表す内部の値は比較されません。

type Value struct {
    // エクスポートされていないフィールドがあります
}

func Append

func Append(s Value, x ...Value) Value

Append は,値 x をスライス s に追加して,結果のスライスを返します。 Go と同様に,各 x の値はスライスの要素型に割り当て可能でなければなりません。

func AppendSlice

func AppendSlice(s, t Value) Value

AppendSlice は,スライス t にスライス t を追加して結果のスライスを返します。 スライス s と t は同じ要素型でなければなりません。

func Indirect

func Indirect(v Value) Value

Indirect は v が指す値を返します。 v が NULL ポインタの場合, Indirect はゼロ値を返します。 v がポインターではない場合, Indirect は v を返します。

func MakeChan

func MakeChan(typ Type, buffer int) Value

MakeChan は指定された型とバッファサイズで新しいチャンネルを作成します。

func MakeFunc 1.1

func MakeFunc(typ Type, fn func(args []Value) (results []Value)) Value

MakeFunc は関数 fn をラップする与えられた Type の新しい関数を返します。 呼び出されると,その新しい関数は次のことを行います。

- 引数を Value のスライスに変換します。
- results := fn(args) を実行します。
- results を Value のスライスとして,正式な結果ごとに 1 つ返します。

実装 fn は,引数 Value スライスが typ によって与えられる引数の数と型を持つと仮定することができます。 typ が可変基数関数を記述している場合,最終の Value は,可変基数関数の本体のように,それ自体可変引数を表すスライスです。 fn によって返される result Value スライスは, typ によって与えられる結果の数と型を持たなければなりません。

Value.Call メソッドを使用すると,呼び出し側は値の観点から型付き関数を呼び出すことができます。 対照的に, MakeFunc は,呼び出し側が値の観点から型付き関数を実装することを可能にします。

ドキュメントの例のセクションには, MakeFunc を使用してさまざまな型のスワップ関数を作成する方法の実例が含まれています。

コード:

// swap は MakeFunc に渡される実装です。
// それは reflect.Values の観点から動作する必要がありますので,型が何であるかを事前に知らなくてもコードを書くことが可能です。
swap := func(in []reflect.Value) []reflect.Value {
    return []reflect.Value{in[1], in[0]}
}

// makeSwap は fptr が nil 関数へのポインタであることを期待します。
// そのポインタを MakeFunc で作成された新しい関数に設定します。
// この関数が呼び出されると, reflect は引数を Values に変換し, swap を呼び出し,次に swap の結果スライスを新しい関数によって返される値に変換します。
makeSwap := func(fptr interface{}) {
    // fptr は関数へのポインタです。
    // 関数の値そのものをリフレクトとして取得します (おそらくゼロ) ので,その型をクエリて値を設定することができます。
    fn := reflect.ValueOf(fptr).Elem()

    // 正しい型の関数を作ります。
    v := reflect.MakeFunc(fn.Type(), swap)

    // fn が表す値に割り当てます。
    fn.Set(v)
}

// int のスワップ関数を作成して呼び出します。
var intSwap func(int, int) (int, int)
makeSwap(&intSwap)
fmt.Println(intSwap(0, 1))

// float64 用のスワップ関数を作成して呼び出します。
var floatSwap func(float64, float64) (float64, float64)
makeSwap(&floatSwap)
fmt.Println(floatSwap(2.72, 3.14))

出力:

1 0
3.14 2.72

func MakeMap

func MakeMap(typ Type) Value

MakeMap は指定された型で新しいマップを作成します。

func MakeMapWithSize 1.9

func MakeMapWithSize(typ Type, n int) Value

MakeMapWithSize は,指定された型と約 n 個の要素の初期スペースで新しいマップを作成します。

func MakeSlice

func MakeSlice(typ Type, len, cap int) Value

MakeSlice は,指定されたスライス型,長さ,および容量に対して,ゼロで初期化された新しいスライス値を作成します。

func New

func New(typ Type) Value

New は,指定された型の新しいゼロ値へのポインタを表す Value を返します。 つまり,返される Value の Type は PtrTo(typ) です。

func NewAt

func NewAt(typ Type, p unsafe.Pointer) Value

NewAt は, p をポインタとして使用して,指定された型の値へのポインタを表す Value を返します。

func Select 1.1

func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)

Select は,ケースのリストに記述されている選択操作を実行します。 Go の select 文と同様に,少なくとも 1 つのケースが処理できるようになるまでブロックし,一様な擬似乱数を選択してから,そのケースを実行します。 選択されたケースのインデックスと,そのケースが受信操作である場合は,受信された値,および値がチャンネルでの送信に対応するかどうかを示すブール値 (チャンネルが閉じているため受信されるゼロ値とは対照的) 。

func ValueOf

func ValueOf(i interface{}) Value

ValueOf は,インターフェース i に格納されている具象値に初期化された新しい Value を返します。 ValueOf(nil) はゼロ値を返します。

func Zero

func Zero(typ Type) Value

Zero は,指定された型のゼロ値を表す値を返します。 結果は,値がまったくないことを表す Value 構造体のゼロ値とは異なります。 たとえば, Zero(TypeOf(42)) は, Kind Int と値 0 の値を返します。 返される値は,アドレス指定も設定もできません。

func (Value) Addr

func (v Value) Addr() Value

Addr は v のアドレスを表すポインタ値を返します。 CanAddr() が false を返すとパニックを起こします。 Addr は通常,ポインタレシーバを必要とするメソッドを呼び出すために,構造体フィールドまたはスライス要素へのポインタを取得するために使用されます。

func (Value) Bool

func (v Value) Bool() bool

Bool は v の内部の値を返します。 v の種類が Bool でなければパニックします。

func (Value) Bytes

func (v Value) Bytes() []byte

Bytes は v の内部の値を返します。 v の内部の値がバイトスライスではない場合はパニックします。

func (Value) Call

func (v Value) Call(in []Value) []Value

Call は,入力引数 in を使用して関数 v を呼び出します。 たとえば, len(in) == 3 の場合, v.Call(in) は Go 呼び出し v を表します (in[0], in[1], in[2]) 。 。 v の種類が Func でなければパニックを呼び出します。 出力結果を Values として返します。 Go と同様に,各入力引数は関数の対応する入力パラメータの型に代入可能でなければなりません。 v が可変長関数の場合, Call は可変長スライスパラメータ自体を作成し,対応する値をコピーします。

func (Value) CallSlice

func (v Value) CallSlice(in []Value) []Value

CallSlice は,入力引数 in を指定して可変長関数 v を呼び出し, [len(in)-1] のスライスを v の最後の可変長引数に割り当てます。 たとえば, len(in) == 3 の場合, v.CallSlice(in) は Go 呼び出し v を表します (in[0], in[1], in[2]...) 。 v の種類が Func ではない場合,または v が可変でない場合, CallSlice はパニックを起こします。 出力結果を Values として返します。 Go と同様に,各入力引数は関数の対応する入力パラメータの型に代入可能でなければなりません。

func (Value) CanAddr

func (v Value) CanAddr() bool

CanAddr は, Addr で値のアドレスを取得できるかどうかを報告します。 そのような値はアドレス可能と呼ばれます。 値がスライスの要素,アドレス可能な配列の要素,アドレス可能な構造体のフィールド,またはポインタの間接参照の結果である場合,値はアドレス可能です。 CanAddr が false を返す場合, Addr を呼び出すとパニックします。

func (Value) CanInterface

func (v Value) CanInterface() bool

CanInterface は,パニックにならずに Interface を使用できるかどうかを報告します。

func (Value) CanSet

func (v Value) CanSet() bool

CanSet は, v の値を変更できるかどうかを報告します。 値は,アドレス指定可能であり,未エクスポートの構造体フィールドを使用しても取得できなかった場合にのみ変更できます。 CanSet が false を返した場合は, Set または型固有のセッター (SetBool , SetInt など) を呼び出すとパニックします。

func (Value) Cap

func (v Value) Cap() int

Cap は v の容量を返します。 v の種類が Array , Chan , Slice のいずれでもない場合はパニックします。

func (Value) Close

func (v Value) Close()

Close はチャンネル v を閉じます。 v の種類が Chan でない場合はパニックします。

func (Value) Complex

func (v Value) Complex() complex128

Complex は v の内部の値を complex128 として返します。 v の種類が Complex64 でも Complex128 でもない場合はパニックします

func (Value) Convert 1.1

func (v Value) Convert(t Type) Value

Convert は,値 t を型 t に変換して返します。 通常の Go 変換規則で,値 v から型 t への変換が許可されていない場合, Convert panics が発生します。

func (Value) Elem

func (v Value) Elem() Value

Elem は,インターフェース v に含まれる値,またはポインタ v が指す値を返します。 v の種類が Interface でも Ptr でもない場合はパニックします。 v が nil の場合,ゼロ値を返します。

func (Value) Field

func (v Value) Field(i int) Value

Field は構造体 v の i 番目のフィールドを返します。 v の種類が構造体でない場合,または i が範囲外の場合はパニックします。

func (Value) FieldByIndex

func (v Value) FieldByIndex(index []int) Value

FieldByIndex は, index に対応する入れ子のフィールドを返します。 v の種類が構造化されていない場合はパニックします。

func (Value) FieldByName

func (v Value) FieldByName(name string) Value

FieldByName は,指定された名前の構造体フィールドを返します。 フィールドが見つからなかった場合はゼロ値を返します。 v の種類が構造化されていない場合はパニックします。

func (Value) FieldByNameFunc

func (v Value) FieldByNameFunc(match func(string) bool) Value

FieldByNameFunc は,match 関数を満たす名前を持つ構造体フィールドを返します。 v の種類が構造化されていない場合はパニックします。 フィールドが見つからなかった場合はゼロ値を返します。

func (Value) Float

func (v Value) Float() float64

Float は v の内部の値を float64 として返します。 v の種類が Float32 でも Float64 でもなければパニックになる

func (Value) Index

func (v Value) Index(i int) Value

インデックスは v の i 番目の要素を返します。 v の Kind が Array , Slice , String のいずれでもない場合,または i が範囲外の場合はパニックします。

func (Value) Int

func (v Value) Int() int64

Int は, v の内部の値を int64 として返します。 v の種類が Int , Int8 , Int16 , Int32 , Int64 のいずれでもない場合はパニックします。

func (Value) Interface

func (v Value) Interface() (i interface{})

インターフェースは v の現在値をinterface{} として返します。 これは以下と同等です。

var i interface{} = (v の内部の値)

値が未エクスポートの構造体フィールドにアクセスすることによって取得された場合はパニックします。

func (Value) InterfaceData

func (v Value) InterfaceData() [2]uintptr

InterfaceData は,インターフェース v の値を uintptr ペアとして返します。 v の種類がインターフェースでない場合はパニックします。

func (Value) IsNil

func (v Value) IsNil() bool

IsNil は,その引数 v が nil かどうかを報告します。 引数は, chan, func, interface, map ,ポインタ,または slice の値でなければなりません。 そうでない場合, IsNil はパニックに陥ります。 IsNil は, Go の nil との通常の比較と必ずしも同じではないことに注意してください。 たとえば,初期化されていないインターフェース変数 i を指定して ValueOf を呼び出して v が作成された場合, i==nil は true になりますが, v.IsNil は v がゼロ値になるためパニックします。

func (Value) IsValid

func (v Value) IsValid() bool

IsValid は, v が値を表しているかどうかを報告します。 v がゼロ値の場合は false を返します。 IsValid が false を返す場合, String 以外の他のすべてのメソッドはパニックします。 ほとんどの関数とメソッドは無効な値を決して返しません。 もしそうであれば,その文書は条件を明示的に述べています。

func (Value) IsZero 1.13

func (v Value) IsZero() bool

IsZero は, v がその型のゼロ値であるかどうかを報告します。引数が無効な場合はパニックします。

func (Value) Kind

func (v Value) Kind() Kind

Kind は v の種類を返します。 v がゼロ値 (IsValid が false を返す) の場合, Kind は Invalid を返します。

func (Value) Len

func (v Value) Len() int

Len は v の長さを返します。 v の種類が Array, Chan, Map, Slice ,または String でない場合はパニックします。

func (Value) MapIndex

func (v Value) MapIndex(key Value) Value

MapIndex は,マップ v の key に関連付けられている値を返します。 v の Kind が Map ではない場合はパニックします。 キーがマップに見つからない場合,または v が nil マップを表す場合は,ゼロの値を返します。 Go と同様に,キーの値はマップのキー型に割り当て可能でなければなりません。

func (Value) MapKeys

func (v Value) MapKeys() []Value

MapKeys は,マップ内に存在するすべてのキーを含むスライスを不定の順序で返します。 v の種類が Map でない場合はパニックします。 v が nil マップを表す場合,空のスライスを返します。

func (Value) MapRange 1.12

func (v Value) MapRange() *MapIter

MapRange は,マップの範囲反復子を返します。 v の種類が Map でない場合はパニックします。

Next を呼び出してイテレータを進め, Key/Value で各エントリにアクセスします。 反復子が使い果たされると, Next は false を返します。 MapRange は,範囲ステートメントと同じ繰り返しセマンティクスに従います。

例 :

iter := reflect.ValueOf(m).MapRange()
for iter.Next() {
	k := iter.Key()
	v := iter.Value()
	...
}

func (Value) Method

func (v Value) Method(i int) Value

Method は v の i 番目のメソッドに対応する関数値を返す返された関数に対する Call の引数には,レシーバを含めないでください。 返される関数は常に v をレシーバとして使います。 i が範囲外の場合,または v が nil インターフェース値の場合,メソッドはパニックします。

func (Value) MethodByName

func (v Value) MethodByName(name string) Value

MethodByName は,指定された名前の v のメソッドに対応する関数値を返します。 返された関数に対する Call の引数には,レシーバを含めないでください。 返される関数は常に v をレシーバとして使います。 メソッドが見つからなかった場合は,ゼロ値を返します。

func (Value) NumField

func (v Value) NumField() int

NumField は構造体 v のフィールド数を返します。 v の種類が構造体でない場合はパニックします。

func (Value) NumMethod

func (v Value) NumMethod() int

NumMethod は,値のメソッドセット内のエクスポートされたメソッドの数を返します。

func (Value) OverflowComplex

func (v Value) OverflowComplex(x complex128) bool

OverflowComplex は complex128 x が v の型で表現できないかどうかを報告します。 v の種類が Complex64 でも Complex128 でもない場合はパニックします。

func (Value) OverflowFloat

func (v Value) OverflowFloat(x float64) bool

OverflowFloat は, float64 x を v の型で表すことができないかどうかを報告します。 v の種類が Float32 でも Float64 でもない場合はパニックします。

func (Value) OverflowInt

func (v Value) OverflowInt(x int64) bool

OverflowInt は, int64 x を v の型で表すことができないかどうかを報告します。 v の種類が Int , Int8 , Int16 , Int32 , Int64 のいずれでもない場合はパニックします。

func (Value) OverflowUint

func (v Value) OverflowUint(x uint64) bool

OverflowUint は, uint64 x を v の型で表すことができないかどうかを報告します。 v の種類が Uint, Uintptr, Uint8, Uint16, Uint32 ,または Uint64 でない場合はパニックします。

func (Value) Pointer

func (v Value) Pointer() uintptr

Pointer は v の値を uintptr として返します。 unsafe.Pointer の代わりに uintptr を返すので, reflect を使ったコードでは,安全でないパッケージを明示的にインポートしないと unsafe.Pointers を取得できません。 v の種類が Chan , Func , Map , Ptr , Slice , UnsafePointer のいずれでもない場合はパニックします。

v の Kind が Func の場合,返されるポインタは内部のコードポインタですが, 1 つの関数を一意に識別するために必ずしも十分ではありません。 唯一の保証は, v が nil func Value である場合に限り,結果がゼロになることです。

v の Kind が Slice の場合,返されるポインタはスライスの最初の要素へのポインタです。 スライスが nil の場合,戻り値は 0 です。 スライスが空で nil 以外の場合,戻り値は 0 以外です。

func (Value) Recv

func (v Value) Recv() (x Value, ok bool)

Recv はチャンネル v から値を受信して​​返します。 v の種類が Chan でない場合はパニックします。 値が準備されるまで受信はブロックされます。 値 x がチャンネル上の送信に対応している場合はブール値 ok ,チャンネルが閉じているため受信されたゼロ値である場合は false です。

func (Value) Send

func (v Value) Send(x Value)

Send は x をチャンネル v で送信します。 v の種類が Chan でない場合,または x の型が v の要素型と同じでない場合はパニックします。 Go と同様に, x の値はチャンネルの要素型に割り当て可能でなければなりません。

func (Value) Set

func (v Value) Set(x Value)

Set は x に値 v を代入します。 CanSet が false を返すとパニックします。 Go と同様に, x の値は v の型に代入可能でなければなりません。

func (Value) SetBool

func (v Value) SetBool(x bool)

SetBool は v の内部の値を設定します。 v の種類が Bool ではない場合,または CanSet() が false の場合はパニックします。

func (Value) SetBytes

func (v Value) SetBytes(x []byte)

SetBytes は v の内部の値を設定します。 v の内部の値がバイトスライスではない場合はパニックします。

func (Value) SetCap 1.2

func (v Value) SetCap(n int)

SetCap は v の容量を n に設定します。 v の種類がスライスではない場合,または n がスライスの長さよりも小さいか,スライスの容量よりも大きい場合はパニックします。

func (Value) SetComplex

func (v Value) SetComplex(x complex128)

SetComplex は v の内部の値を x に設定します。 v の Kind が Complex64 でも Complex128 でもない場合,または CanSet() が false の場合はパニックします。

func (Value) SetFloat

func (v Value) SetFloat(x float64)

SetFloat は v の内部の値を x に設定します。 v の Kind が Float32 でも Float64 でもない場合,または CanSet() が false の場合はパニックします。

func (Value) SetInt

func (v Value) SetInt(x int64)

SetInt は v の内部の値を x に設定します。 v の種類が Int , Int8 , Int16 , Int32 , Int64 のいずれでもない場合,または CanSet() が false の場合はパニックします。

func (Value) SetLen

func (v Value) SetLen(n int)

SetLen は v の長さを n に設定します。 v の種類がスライスではない場合,または n が負の値であるかスライスの容量よりも大きい場合はパニックします。

func (Value) SetMapIndex

func (v Value) SetMapIndex(key, elem Value)

SetMapIndex は,マップ v のキーに関連付けられている要素を elem に設定します。 v の種類がマップでない場合,パニックします。 elem がゼロの値である場合, SetMapIndex はマップからキーを削除します。そうでなければ, v が nil マップを保持している場合, SetMapIndex はパニックします。 Go のように,キーの elem はマップのキー型に割り当て可能でなければならず, elem の値はマップの elem 型に割り当て可能でなければなりません。

func (Value) SetPointer

func (v Value) SetPointer(x unsafe.Pointer)

SetPointer は,安全でない Pointer 値 v を x に設定します。 v の種類が UnsafePointer ではない場合はパニックします。

func (Value) SetString

func (v Value) SetString(x string)

SetString は v の内部の値を x に設定します。 v の Kind が String でない場合,または CanSet() が false の場合はパニックします。

func (Value) SetUint

func (v Value) SetUint(x uint64)

SetUint は v の内部の値を x に設定します。 v の種類が Uint , Uintptr , Uint8 , Uint16 , Uint32 , Uint64 のいずれでもない場合,または CanSet() が false の場合はパニックします。

func (Value) Slice

func (v Value) Slice(i, j int) Value

Slice は v[i:j] を返します。 v の Kind が Array , Slice , String のいずれでもない場合, v がアドレス指定不可能な配列の場合,またはインデックスが範囲外の場合はパニックします。

func (Value) Slice3 1.2

func (v Value) Slice3(i, j, k int) Value

Slice3 はスライス操作の 3 インデックス形式です。 v[i:j:k] を返します。 v の種類が配列でもスライスでもない場合,または v がアドレス指定不可能な配列である場合,またはインデックスが範囲外の場合はパニックします。

func (Value) String

func (v Value) String() string

String は,文字列 v の内部の値を文字列として返します。 Go の String メソッド規約のため, String は特別な場合です。 他のゲッターとは異なり, v の Kind が String でなくてもパニックにはなりません。 代わりに, "<T value>" の形式の文字列を返します。 ここで, T は v の型です。 fmt パッケージは Values を特別に扱います。 String メソッドを暗黙的に呼び出すのではなく,保持している具体的な値を出力します。

func (Value) TryRecv

func (v Value) TryRecv() (x Value, ok bool)

TryRecv はチャンネル v から値を受信しようとしますが,ブロックはしません。 v の種類が Chan でない場合はパニックします。 受信が値を配信する場合, x は転送された値であり, ok は真です。 受信をブロックせずに終了できない場合, x はゼロ値であり, ok は false です。 チャンネルが閉じている場合, x はチャンネルの要素型のゼロ値であり, ok は false です。

func (Value) TrySend

func (v Value) TrySend(x Value) bool

TrySend はチャンネル v で x を送信しようとしますが,ブロックはしません。 v の種類が Chan でない場合はパニックします。 値が送信されたかどうかを報告します。 Go と同様に, x の値はチャンネルの要素型に割り当て可能でなければなりません。

func (Value) Type

func (v Value) Type() Type

Type は v の型を返します。

func (Value) Uint

func (v Value) Uint() uint64

Uint は, v の内部の値を uint64 として返します。 v の種類が Uint, Uintptr, Uint8, Uint16, Uint32 ,または Uint64 でない場合はパニックします。

func (Value) UnsafeAddr

func (v Value) UnsafeAddr() uintptr

UnsafeAddr は v のデータへのポインタを返します。 "unsafe" パッケージもインポートするのは上級クライアント向けです。 v がアドレス指定できない場合はパニックします。

type ValueError

ValueError は,それをサポートしていない Value に対して Value メソッドが呼び出されると発生します。 そのような場合は,各メソッドの説明に記載されています。

type ValueError struct {
    Method string
    Kind   Kind
}

func (*ValueError) Error

func (e *ValueError) Error() string

Bugs