Documentation
¶
Overview ¶
Package reflect はランタイムリフレクションを実装し、プログラムが任意の型のオブジェクトを操作できるようにします。典型的な使用方法は、静的型 interface{} の値を取り、TypeOf を呼び出してその動的な型情報を抽出することです。TypeOf は Type を返します。 ValueOf への呼び出しは、実行時データを表す Value を返します。Zero は Type を受け取り、その型のゼロ値を表す Value を返します。 Go におけるリフレクションの紹介については、「The Laws of Reflection」を参照してください: https://golang.org/doc/articles/laws_of_reflection.html
Index ¶
- Constants
- func Copy(dst, src Value) int
- func DeepEqual(x, y any) bool
- func Swapper(slice any) func(i, j int)
- type ChanDir
- type Kind
- type MapIter
- type Method
- type SelectCase
- type SelectDir
- type SliceHeader
- type StringHeaderdeprecated
- type StructField
- type StructTag
- type Type
- func ArrayOf(length 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 PointerTo(t Type) Type
- func PtrTo(t Type) Type
- func SliceOf(t Type) Type
- func StructOf(fields []StructField) Type
- func TypeOf(i any) 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 any) 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) CanComplex() bool
- func (v Value) CanConvert(t Type) bool
- func (v Value) CanFloat() bool
- func (v Value) CanInt() bool
- func (v Value) CanInterface() bool
- func (v Value) CanSet() bool
- func (v Value) CanUint() bool
- func (v Value) Cap() int
- func (v Value) Clear()
- func (v Value) Close()
- func (v Value) Comparable() bool
- func (v Value) Complex() complex128
- func (v Value) Convert(t Type) Value
- func (v Value) Elem() Value
- func (v Value) Equal(u Value) bool
- func (v Value) Field(i int) Value
- func (v Value) FieldByIndex(index []int) Value
- func (v Value) FieldByIndexErr(index []int) (Value, error)
- func (v Value) FieldByName(name string) Value
- func (v Value) FieldByNameFunc(match func(string) bool) Value
- func (v Value) Float() float64
- func (v Value) Grow(n int)
- func (v Value) Index(i int) Value
- func (v Value) Int() int64
- func (v Value) Interface() (i any)
- 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) SetIterKey(iter *MapIter)
- func (v Value) SetIterValue(iter *MapIter)
- 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) SetZero()
- 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
- func (v Value) UnsafePointer() unsafe.Pointer
- type ValueError
Examples ¶
Constants ¶
const Ptr = Pointer
PtrはPointer種別の旧名称です。
Variables ¶
This section is empty.
Functions ¶
func Copy ¶
Copyは、dstが満たされるか、srcが使い果たされるまで、srcの内容をdstにコピーします。 コピーされた要素の数を返します。 DstとsrcはそれぞれSliceまたはArrayの種類でなければならず、 dstとsrcは同じ要素の型でなければなりません。
特別な場合として、dstの要素の種類がUint8である場合、srcの種類はStringであることができます。
func DeepEqual ¶
DeepEqualは、xとyが「深く等しい」という条件であるかどうかを報告します。 同一の型の2つの値は、次のどちらかの場合に深く等しいと見なされます。 異なる型の値は、決して深く等しくありません。
配列の値は、それぞれの要素が深く等しい場合に深く等しいと見なされます。
構造体の値は、対応するフィールド(公開されたものと非公開のもの)が深く等しい場合に深く等しいと見なされます。
関数の値は、どちらもnilの場合には深く等しく、それ以外の場合は深く等しくありません。
インタフェースの値は、深く等しい具体的な値を保持している場合に深く等しいと見なされます。
マップの値は、次のすべてが真である場合に深く等しいと見なされます: どちらもnilまたはどちらも非nilであり、長さが同じであり、 同じマップオブジェクトであるか、または対応するキー(Goの等値性を使用して一致する)が深く等しい値にマップされている場合。
ポインタの値は、Goの==演算子を使用して等しければ、深く等しいと見なされます。 または、深く等しい値を指している場合も深く等しくなります。
スライスの値は、次のすべてが真である場合に深く等しいと見なされます: どちらもnilまたはどちらも非nilであり、長さが同じであり、 同じ基礎配列の同じ初期エントリを指しているか(つまり、&x[0] == &y[0])または対応する要素(長さまで)が深く等しい場合。 非nilの空のスライスとnilのスライス(例:[]byte{}と[]byte(nil))は深く等しくありません。
他の値 - 数値、ブール値、文字列、およびチャネル - は、Goの==演算子を使用して等しい場合に深く等しいです。
一般的には、DeepEqualはGoの==演算子の再帰的な緩和です。 ただし、このアイデアは一貫性のないもので実装することは不可能です。 具体的には、値が自身に等しくない場合があります。 これは、func型であるため(一般的には比較できない)または浮動小数点NaN値であるためです または、そのような値を含む配列、構造体、またはインタフェースであるためです。 一方、ポインタの値は常に自身に等しく、それらがまたはそのような問題のある値を指している場合でも等しいため、 それらはGoの==演算子を使用して等しいため、その条件さえ満たせば、その内容に関係なく深く等しいと見なされます。 DeepEqualは、同じスライスまたは同じマップである場合、 コンテンツに関係なく深く等しいと見なされるように定義されています。
DeepEqualはデータ値をトラバースする中で、サイクルを検出することがあります。 DeepEqualが以前に比較したポインタの値を2回目以降比較するとき、それらを指す値を検査せずに等しいと見なします。 これにより、DeepEqualが終了することが保証されます。
Types ¶
type Kind ¶
type Kind uint
Kindは、Typeが表す特定の種類の型を表します。 ゼロのKindは有効な種類ではありません。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/reflect" ) func main() { for _, v := range []any{"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()) } } }
Output: hi 42 unhandled kind func
type MapIter ¶ added in v1.12.0
type MapIter struct {
// contains filtered or unexported fields
}
MapIterは、マップを範囲指定するためのイテレータです。 Value.MapRangeを参照してください。
func (*MapIter) Next ¶ added in v1.12.0
Nextはマップイテレータを進め、別のエントリがあるかどうかを報告します。 iterが終了した場合はfalseを返します。Key、Value、またはNextへの後続の呼び出しはパニックを引き起こします。
type Method ¶
type Method struct { // Nameはメソッド名です。 Name string // PkgPathは、小文字(エクスポートされていない)のメソッド名を修飾するパッケージパスです。大文字(エクスポートされた)のメソッド名の場合は空です。 // PkgPathとNameの組み合わせは、メソッドセット内のメソッドを一意に識別します。 // https://golang.org/ref/spec#Uniqueness_of_identifiers を参照してください。 PkgPath string Type Type Func Value Index int }
Methodは単一のメソッドを表します。
func (Method) IsExported ¶ added in v1.17.0
IsExportedはメソッドがエクスポートされているかどうかを報告します。
type SelectCase ¶ added in v1.1.0
SelectCaseは、select操作内の1つのcaseを表します。 caseの種類は、Dir(通信の方向)に依存します。 もしDirがSelectDefaultである場合、caseはデフォルトのcaseを表します。 ChanとSendはゼロ値でなければなりません。 もしDirがSelectSendである場合、caseは送信操作を表します。 通常、Chanの基礎となる値はチャネルであり、Sendの基礎となる値はチャネルの要素型に代入可能でなければなりません。 特別な場合として、もしChanがゼロ値である場合、そのcaseは無視され、フィールドのSendも無視され、ゼロ値またはゼロ値でないどちらでもかまいません。 もしDirがSelectRecvである場合、caseは受信操作を表します。 通常、Chanの基礎となる値はチャネルであり、Sendはゼロ値でなければなりません。 もしChanがゼロ値である場合、そのcaseは無視されますが、Sendはゼロ値でなければなりません。 受信操作が選択されると、受信された値はSelectによって返されます。
type SelectDir ¶ added in v1.1.0
type SelectDir int
SelectDirはセレクト文の通信方向を表します。
const ( SelectSend SelectDir SelectRecv SelectDefault )
type SliceHeader ¶
SliceHeaderはスライスのランタイム表現です。 これは安全でも可搬性がありませんし、将来のバージョンで変更されるかもしれません。 さらに、Dataフィールドだけではデータがガベージコレクトされないことを保証できないため、 プログラムは基礎データへの正しい型のポインタを別に保持する必要があります。
廃止予定: 代わりにunsafe.Sliceまたはunsafe.SliceDataを使用してください。
type StringHeader
deprecated
type StructField ¶
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 Anonymous bool }
StructFieldはstruct内のフィールドを1つ記述します。
func VisibleFields ¶ added in v1.17.0
func VisibleFields(t Type) []StructField
VisibleFieldsはtの中のすべての可視フィールドを返します。tはstruct型である必要があります。 フィールドは、FieldByName呼び出しで直接アクセス可能ならば、可視として定義されます。 返されるフィールドには、無名structメンバー内のフィールドと非公開フィールドが含まれます。 これらは、struct内で見つかった順序と同じ並び順になります。無名フィールドは、即座にそれに続く昇格フィールドが続きます。
返されるスライスの各要素eに対応するフィールドは、値vのタイプtからv.FieldByIndex(e.Index)を呼び出すことで取得できます。
func (StructField) IsExported ¶ added in v1.17.0
func (f StructField) IsExported() bool
IsExportedはフィールドがエクスポートされているかどうかを報告します。
type StructTag ¶
type StructTag string
StructTagは、structフィールドのタグ文字列です。
慣例として、タグ文字列はオプションでスペースで区切られたkey:"value"の連結です。 各キーは、スペース(U+0020 ' ')、引用符(U+0022 '"')、 コロン(U+003A ':')以外の非制御文字で構成される空でない文字列です。 各値は、U+0022 '"'文字とGoの文字列リテラル構文を使用して引用されます。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/reflect" ) func main() { 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")) }
Output: blue gopher
func (StructTag) Get ¶
Getはtag文字列内のキーに関連付けられた値を返します。 もしtag内にそのようなキーが存在しない場合、Getは空の文字列を返します。 もしtagが従来の形式を持っていない場合、Getが返す値は不特定です。 タグが明示的に空の文字列に設定されているかどうかを判断するには、Lookupを使用してください。
func (StructTag) Lookup ¶ added in v1.7.0
Lookupは、タグ文字列内のキーに関連する値を返します。 キーがタグ内に存在する場合、その値(空かもしれません)が返されます。 キーがタグに明示的に設定されていない場合、返される値は空の文字列になります。 okの返り値は、値がタグ文字列に明示的に設定されているかどうかを報告します。 タグに通常の形式がない場合、Lookupによって返される値は指定されていません。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/reflect" ) func main() { 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)") } } }
Output: field_0 (blank) (not specified)
type Type ¶
type Type interface { // Align returns the alignment in bytes of a value of // this type when allocated in memory. Align() int // FieldAlign returns the alignment in bytes of a value of // this type when used as a field in a struct. FieldAlign() int // Method returns the i'th method in the type's method set. // It panics if i is not in the range [0, NumMethod()). // // For a non-interface type T or *T, the returned Method's Type and Func // fields describe a function whose first argument is the receiver, // and only exported methods are accessible. // // For an interface type, the returned Method's Type field gives the // method signature, without a receiver, and the Func field is nil. // // Methods are sorted in lexicographic order. Method(int) Method // MethodByName returns the method with that name in the type's // method set and a boolean indicating if the method was found. // // For a non-interface type T or *T, the returned Method's Type and Func // fields describe a function whose first argument is the receiver. // // For an interface type, the returned Method's Type field gives the // method signature, without a receiver, and the Func field is nil. MethodByName(string) (Method, bool) // NumMethod returns the number of methods accessible using Method. // // For a non-interface type, it returns the number of exported methods. // // For an interface type, it returns the number of exported and unexported methods. NumMethod() int // Name returns the type's name within its package for a defined type. // For other (non-defined) types it returns the empty string. Name() string // PkgPath returns a defined type's package path, that is, the import path // that uniquely identifies the package, such as "encoding/base64". // If the type was predeclared (string, error) or not defined (*T, struct{}, // []int, or A where A is an alias for a non-defined type), the package path // will be the empty string. PkgPath() string // Size returns the number of bytes needed to store // a value of the given type; it is analogous to unsafe.Sizeof. Size() uintptr // String returns a string representation of the type. // The string representation may use shortened package names // (e.g., base64 instead of "encoding/base64") and is not // guaranteed to be unique among types. To test for type identity, // compare the Types directly. String() string // Kind returns the specific kind of this type. Kind() Kind // Implements reports whether the type implements the interface type u. Implements(u Type) bool // AssignableTo reports whether a value of the type is assignable to type u. AssignableTo(u Type) bool // ConvertibleTo reports whether a value of the type is convertible to type u. // Even if ConvertibleTo returns true, the conversion may still panic. // For example, a slice of type []T is convertible to *[N]T, // but the conversion will panic if its length is less than N. ConvertibleTo(u Type) bool // Comparable reports whether values of this type are comparable. // Even if Comparable returns true, the comparison may still panic. // For example, values of interface type are comparable, // but the comparison will panic if their dynamic type is not comparable. Comparable() bool // Bits returns the size of the type in bits. // It panics if the type's Kind is not one of the // sized or unsized Int, Uint, Float, or Complex kinds. Bits() int // ChanDir returns a channel type's direction. // It panics if the type's Kind is not Chan. ChanDir() ChanDir // IsVariadic reports whether a function type's final input parameter // is a "..." parameter. If so, t.In(t.NumIn() - 1) returns the parameter's // implicit actual type []T. // // For concreteness, if t represents func(x int, y ... float64), then // // t.NumIn() == 2 // t.In(0) is the reflect.Type for "int" // t.In(1) is the reflect.Type for "[]float64" // t.IsVariadic() == true // // IsVariadic panics if the type's Kind is not Func. IsVariadic() bool // Elem returns a type's element type. // It panics if the type's Kind is not Array, Chan, Map, Pointer, or Slice. Elem() Type // Field returns a struct type's i'th field. // It panics if the type's Kind is not Struct. // It panics if i is not in the range [0, NumField()). Field(i int) StructField // FieldByIndex returns the nested field corresponding // to the index sequence. It is equivalent to calling Field // successively for each index i. // It panics if the type's Kind is not Struct. FieldByIndex(index []int) StructField // FieldByName returns the struct field with the given name // and a boolean indicating if the field was found. FieldByName(name string) (StructField, bool) // FieldByNameFunc returns the struct field with a name // that satisfies the match function and a boolean indicating if // the field was found. // // FieldByNameFunc considers the fields in the struct itself // and then the fields in any embedded structs, in breadth first order, // stopping at the shallowest nesting depth containing one or more // fields satisfying the match function. If multiple fields at that depth // satisfy the match function, they cancel each other // and FieldByNameFunc returns no match. // This behavior mirrors Go's handling of name lookup in // structs containing embedded fields. FieldByNameFunc(match func(string) bool) (StructField, bool) // In returns the type of a function type's i'th input parameter. // It panics if the type's Kind is not Func. // It panics if i is not in the range [0, NumIn()). In(i int) Type // Key returns a map type's key type. // It panics if the type's Kind is not Map. Key() Type // Len returns an array type's length. // It panics if the type's Kind is not Array. Len() int // NumField returns a struct type's field count. // It panics if the type's Kind is not Struct. NumField() int // NumIn returns a function type's input parameter count. // It panics if the type's Kind is not Func. NumIn() int // NumOut returns a function type's output parameter count. // It panics if the type's Kind is not Func. NumOut() int // Out returns the type of a function type's i'th output parameter. // It panics if the type's Kind is not Func. // It panics if i is not in the range [0, NumOut()). Out(i int) Type // contains filtered or unexported methods }
TypeはGoの型の表現です。
すべてのメソッドがすべての種類の型に適用されるわけではありません。制限がある場合は、各メソッドのドキュメントに記載されています。 kind-specificメソッドを呼び出す前に型の種類を知るためにKindメソッドを使用してください。型の種類に適切でないメソッドを呼び出すと、ランタイムパニックが発生します。
Typeの値は比較可能であり、==演算子などで使用することができます。 2つのTypeの値は、同一の型を表している場合に等しいとされます。
func ArrayOf ¶ added in v1.5.0
ArrayOfは、与えられた長さと要素の型を持つ配列型を返します。 例えば、tがintを表す場合、ArrayOf(5, t)は[5]intを表します。
もし結果の型が利用可能なアドレススペースよりも大きくなる場合、ArrayOfはパニックを発生させます。
func ChanOf ¶ added in v1.1.0
ChanOfは指定された方向と要素の型を持つチャネル型を返します。 たとえば、tがintを表す場合、ChanOf(RecvDir, t)は<-chan intを表します。
gcのランタイムは、チャネルの要素型に64 kBの制限を課しています。 もしtのサイズがこの制限以上である場合、ChanOfはパニックを発生させます。
func FuncOf ¶ added in v1.5.0
FuncOfは与えられた引数と戻り値の型を持つ関数型を返します。 例えば、kがintを表し、eがstringを表す場合、 FuncOf([]Type{k}, []Type{e}, false)はfunc(int) stringを表します。
可変引数の引数は、関数が可変引数かどうかを制御します。FuncOfは、 variadicがtrueであり、in[len(in)-1]がスライスを表していない場合にパニックを起こします。
func MapOf ¶ added in v1.1.0
MapOfは与えられたキーと要素の型のマップタイプを返します。 例えば、もしkがintを表し、eがstringを表すならば、MapOf(k, e)はmap[int]stringを表します。
もしキーの型が有効なマップキータイプではない場合(つまり、Goの==演算子を実装していない場合)、MapOfはパニックを起こします。
func PointerTo ¶ added in v1.18.0
PointerToは要素tを持つポインタ型を返します。 例えば、もしtがFoo型を表すなら、PointerTo(t)は*Fooを表します。
func PtrTo ¶
PtrToは、要素tを持つポインタ型を返します。 例えば、もしtがFoo型を表すなら、PtrTo(t)は*Fooを表します。
PtrToはPointerToの古い綴りです。 これらの2つの関数は同じように動作します。
func StructOf ¶ added in v1.7.0
func StructOf(fields []StructField) Type
StructOfはフィールドを含む構造体の型を返します。 OffsetとIndexのフィールドは無視され、コンパイラによって計算されます。
StructOfは現在、埋め込まれたフィールドに対してラッパーメソッドを生成せず、 非公開のStructFieldsが渡された場合はパニックします。 これらの制限は将来のバージョンで解除される可能性があります。
Example ¶
package main import ( "github.com/shogo82148/std/bytes" "github.com/shogo82148/std/encoding/json" "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/reflect" ) func main() { 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) }
Output: value: &{Height:0.4 Age:2} json: {"height":0.4,"age":2} value: &{Height:1.5 Age:10}
func TypeOf ¶
TypeOfは、iの動的な型を表す反射Typeを返します。 もしiがnilのインターフェース値である場合、TypeOfはnilを返します。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/io" "github.com/shogo82148/std/os" "github.com/shogo82148/std/reflect" ) func main() { // インターフェース型は静的な型付けにしか使用されませんので、 // インターフェース型Fooの反射Typeを見つけるための一般的な方法は、*Fooの値を使用するというものです。 writerType := reflect.TypeOf((*io.Writer)(nil)).Elem() fileType := reflect.TypeOf((*os.File)(nil)) fmt.Println(fileType.Implements(writerType)) }
Output: true
type Value ¶
type Value struct {
// contains filtered or unexported fields
}
ValueはGo言語の値に対する反射インターフェースです。
すべてのメソッドがすべての種類の値に適用されるわけではありません。制限事項がある場合は、各メソッドのドキュメントに記載されています。 kind-specificメソッドを呼び出す前に、値の種類を特定するためにKindメソッドを使用してください。型に適切でないメソッドを呼び出すと、ランタイムパニックが発生します。
ゼロ値は何も表していません。 そのIsValidメソッドはfalseを返し、KindメソッドはInvalidを返し、Stringメソッドは"<invalid Value>"を返し、他のすべてのメソッドはパニックを発生させます。 ほとんどの関数やメソッドは無効な値を返さないでしょう。 もし返す場合は、そのドキュメントに条件が明示されています。
Valueは、基礎となるGoの値が同等の直接操作で並行に使用できる場合、複数のゴルーチンで同時に使用することができます。
2つのValueを比較するには、Interfaceメソッドの結果を比較してください。 ==を使用して2つのValueを比較すると、それらが表す基礎の値を比較しません。
func AppendSlice ¶
AppendSliceは、スライスtをスライスsに追加し、結果のスライスを返します。 スライスsとtは同じ要素の型でなければなりません。
func Indirect ¶
Indirectは、vが指す値を返します。 vがnilポインターの場合、Indirectはゼロ値を返します。 vがポインターでない場合、Indirectはvを返します。
func MakeFunc ¶ added in v1.1.0
MakeFuncは、与えられたTypeの新しい関数を返します。 この新しい関数は、呼び出されると以下の操作を実行します:
- 引数をValuesのスライスに変換します。
- results := fn(args)を実行します。
- 結果を一つずつフォーマルな結果に対応するValuesのスライスとして返します。
fnの実装は、引数のValueのスライスがtypで与えられた引数の数と型を持っていると仮定できます。 typが可変長引数の関数を記述している場合、最後のValue自体が可変長引数を表すスライス(可変長引数の関数の本体と同じように)です。 fnによって返される結果のValueのスライスは、typで与えられた結果の数と型を持つ必要があります。
Value.Callメソッドを使用することで、呼び出し元はValuesを用いた型指定の関数を呼び出すことができます。 対照的に、MakeFuncは型指定の関数をValuesを用いて実装することを呼び出し元に許可します。
ドキュメントのExamplesセクションには、さまざまな型のスワップ関数を構築する方法の説明が含まれています。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/reflect" ) func main() { // 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 any) { // fptrは関数へのポインタです。 // リフレクト値として関数値自体(おそらくnil)を取得し、 // その型をクエリできるようにするために値を設定します。 fn := reflect.ValueOf(fptr).Elem() // 適切な型の関数を作成します。 v := reflect.MakeFunc(fn.Type(), swap) // fnを表す値に割り当てる。 fn.Set(v) } // int型のためのswap関数を作成して呼び出す。 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)) }
Output: 1 0 3.14 2.72
func MakeMapWithSize ¶ added in v1.9.0
MakeMapWithSizeは、指定された型とおおよそのn個の要素のための初期空間を持つ新しいマップを作成します。
func Select ¶ added in v1.1.0
func Select(cases []SelectCase) (chosen int, recv Value, recvOK bool)
Selectは、ケースのリストによって説明されるselect操作を実行します。 Goのselect文と同様に、少なくとも1つのケースが進行できるまでブロックされ、一様な擬似乱数選択を行い、 その後、選択されたケースを実行します。選択されたケースのインデックスを返し、 もしケースが受信操作である場合は、受信した値と、その値がチャネルに送信された値と対応するかどうかを示す 真偽値を返します(チャネルがクローズされたためにゼロ値が受信された場合とは異なります)。 Selectは最大65536のケースをサポートしています。
func Zero ¶
Zeroは指定された型のゼロ値を表すValueを返します。 結果はValue構造体のゼロ値とは異なり、値が存在しないことを表します。 例えば、Zero(TypeOf(42))はKindがIntで値が0のValueを返します。 返された値はアドレスを取ることも変更することもできません。
func (Value) Addr ¶
Addrはvのアドレスを表すポインタ値を返します。 CanAddr()がfalseを返す場合にはパニックを発生させます。 Addrは通常、構造体のフィールドやスライスの要素に対して ポインタレシーバを必要とするメソッドを呼び出すために ポインタを取得するために使用されます。
func (Value) Call ¶
Callは引数inを使って関数vを呼び出します。 例えば、len(in) == 3の場合、v.Call(in)はGoの呼び出しv(in[0], in[1], in[2])を表します。 CallはvのKindがFuncでない場合にパニックを発生させます。 Callは結果をValuesとして返します。 Goと同様に、各入力引数は関数の対応する入力パラメータの型に代入可能でなければなりません。 もしvが可変引数関数である場合、Callは対応する値をコピーして可変引数スライスパラメータを作成します。
func (Value) CallSlice ¶
CallSliceは可変長関数vを入力引数inで呼び出し、スライスin[len(in)-1]をvの最終可変引数に割り当てます。 例えば、len(in) == 3の場合、v.CallSlice(in)はGoの呼び出しv(in[0], in[1], in[2]...)を表します。 CallSliceはvのKindがFuncでないか、可変引数でない場合にパニックを引き起こします。 出力結果はValuesとして返されます。 Goと同様に、各入力引数は関数の対応する入力パラメータの型に代入可能でなければなりません。
func (Value) CanAddr ¶
CanAddr関数は、値のアドレスをAddrで取得できるかどうかを報告します。 このような値は、addressableと呼ばれます。値がaddressableであるとは、 スライスの要素、addressableな配列の要素、addressableな構造体のフィールド、 またはポインタの参照結果である場合を指します。 CanAddrがfalseを返す場合、Addrを呼び出すとパニックが発生します。
func (Value) CanComplex ¶ added in v1.18.0
CanComplexはComplexをパニックを起こさずに使用できるかどうかを報告します。
func (Value) CanConvert ¶ added in v1.17.0
CanConvertは、値vが型tに変換可能かどうかを報告します。 v.CanConvert(t)がtrueを返す場合、v.Convert(t)はパニックしません。
func (Value) CanInterface ¶
CanInterfaceは、パニックなしでInterfaceを使用できるかどうかを報告します。
func (Value) CanSet ¶
CanSetはvの値を変更できるかどうかを報告します。 値はアドレス可能であり、非公開の構造体フィールドの使用では 取得されていない場合にのみ変更できます。 CanSetがfalseを返す場合、Setや任意のタイプ固有のセッター(例:SetBool、SetInt)を呼び出すとパニックが発生します。
func (Value) Clear ¶ added in v1.21.0
func (v Value) Clear()
Clearメソッドは、マップの内容をクリアするか、スライスの内容をゼロにします。
もしvのKindがマップまたはスライスでない場合、panicが発生します。
func (Value) Comparable ¶ added in v1.20.0
Comparableは値vが比較可能かどうかを報告します。 もしvの型がインターフェースである場合、これは動的な型をチェックします。 もしこれがtrueを報告する場合、v.Interface() == x はどんなxに対してもパニックを起こしませんし、 v.Equal(u) もどんなValue uに対してもパニックを起こしません。
func (Value) Complex ¶
func (v Value) Complex() complex128
Complexはvの基礎となる値、つまりcomplex128を返します。 vのKindがComplex64またはComplex128でない場合、パニックを発生させます。
func (Value) Convert ¶ added in v1.1.0
Convert は値 v を型 t に変換した値を返します。 もし通常の Go の変換ルールによって値 v を型 t に変換することができない場合、または、v を型 t に変換する際にパニックが発生する場合、Convert はパニックを発生させます。
func (Value) Elem ¶
Elemは、インターフェースvに格納されている値またはvのポインタが指す値を返します。 vのKindがインターフェースまたはポインタでない場合、パニックが発生します。 vがnilの場合、ゼロのValueを返します。
func (Value) Equal ¶ added in v1.20.0
Equalは、vがuと等しい場合にtrueを返します。 2つの無効な値に対して、Equalはtrueを返します。 インターフェース値の場合、Equalはインターフェース内の値を比較します。 それ以外の場合、値の型が異なる場合はfalseを返します。 また、配列や構造体の場合、Equalは順番に各要素を比較し、 等しくない要素が見つかった場合にfalseを返します。 すべての比較中、同じ型の値が比較され、その型が比較できない場合、Equalはパニックを引き起こします。
func (Value) FieldByIndex ¶
FieldByIndexは、インデックスに対応するネストされたフィールドを返します。 評価にはnilポインターを通過する必要があるか、または構造体でないフィールドの場合、パニックします。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/reflect" ) func main() { // この例は、昇格されたフィールドの名前がその他のフィールドによって隠される場合のケースを示しています。FieldByNameは機能しないため、代わりにFieldByIndexを使用する必要があります。 type user struct { firstName string lastName string } type data struct { user firstName string lastName string } u := data{ user: user{"Embedded John", "Embedded Doe"}, firstName: "John", lastName: "Doe", } s := reflect.ValueOf(u).FieldByIndex([]int{0, 1}) fmt.Println("embedded last name:", s) }
Output: embedded last name: Embedded Doe
func (Value) FieldByIndexErr ¶ added in v1.18.0
FieldByIndexErrは、インデックスに対応するネストしたフィールドを返します。 評価によってnilポインターを進める必要がある場合はエラーを返し、 structではないフィールドを進める必要がある場合はパニックを引き起こします。
func (Value) FieldByName ¶
FieldByNameは指定された名前の構造体フィールドを返します。 フィールドが見つからない場合はゼロ値を返します。 vのKindがstructでない場合はパニックを起こします。
Example ¶
package main import ( "github.com/shogo82148/std/fmt" "github.com/shogo82148/std/reflect" ) func main() { type user struct { firstName string lastName string } u := user{firstName: "John", lastName: "Doe"} s := reflect.ValueOf(u) fmt.Println("Name:", s.FieldByName("firstName")) }
Output: Name: John
func (Value) FieldByNameFunc ¶
FieldByNameFuncは、マッチ関数を満たす名前を持つ構造体フィールドを返します。 vのKindがstructでない場合、パニックを起こします。 フィールドが見つからなかった場合、ゼロの値を返します。
func (Value) Interface ¶
Interfaceは、vの現在の値をinterface{}として返します。 これは以下と同等です:
var i interface{} = (vの基底値)
もしValueが非公開の構造体フィールドにアクセスして取得された場合はパニックを起こします。
func (Value) InterfaceData ¶
InterfaceDataは未指定のuintptr値のペアを返します。 vの種類がInterfaceでない場合、エラーが発生します。
Goの以前のバージョンでは、この関数はインターフェースの値をuintptrのペアで返していました。 Go 1.4以降、インターフェースの値の実装はInterfaceDataの定義された使用を除外しています。
廃止予定: インターフェースの値のメモリ表現はInterfaceDataと互換性がありません。
func (Value) IsNil ¶
IsNilは引数vがnilであるかどうかを報告します。引数は chan、func、interface、map、pointer、またはsliceの値である必要があります。そうでない場合、IsNilはパニックを引き起こします。注意点として、Go言語での通常のnilとの比較とは常に等しくありません。例えば、vが初期化されていないインターフェース変数iを使用してValueOfを呼び出した場合、i==nilはtrueとなりますが、v.IsNilはvがゼロ値であるためパニックを引き起こします。
func (Value) IsValid ¶
IsValidは、vが値を表すかどうかを報告します。 vがゼロ値の場合はfalseを返します。 IsValidがfalseを返す場合、Stringを除いた他のメソッドはすべてパニックします。 ほとんどの関数やメソッドは無効な値を返しません。 無効な値を返す場合、そのドキュメントは明示的に条件を説明します。
func (Value) MapIndex ¶
MapIndex は、マップ v に関連付けられたキーの値を返します。 v の Kind がマップでない場合、パニックが発生します。 key がマップ内に見つからない場合や v が nil マップを表す場合、ゼロ値が返されます。 Go と同様に、キーの値はマップのキーの型に代入可能でなければなりません。
func (Value) MapKeys ¶
MapKeysは、マップ内に存在するすべてのキーを含むスライスを返します。 順序は指定されていません。 vのKindがMapでない場合、パニックを発生させます。 vがnilのマップを表す場合、空のスライスを返します。
func (Value) MapRange ¶ added in v1.12.0
MapRangeはマップの範囲イテレータを返します。 vの種類がマップでない場合はパニックを起こします。
イテレータを進めるためにはNextを呼び出し、各エントリにアクセスするためにはKey/Valueを使用します。 イテレータが使い果たされるとNextはfalseを返します。 MapRangeはrange文と同じイテレーションのセマンティクスに従います。
例:
iter := reflect.ValueOf(m).MapRange() for iter.Next() { k := iter.Key() v := iter.Value() ... }
func (Value) Method ¶
メソッドは、vのi番目のメソッドに対応する関数値を返します。 返された関数に対するCallの引数には、レシーバを含めないでください。 返された関数は常にvをレシーバとして使用します。 iが範囲外であるか、vがnilインターフェースの値である場合、Methodはパニックを引き起こします。
func (Value) MethodByName ¶
MethodByNameは、指定された名前のメソッドに対応する関数値を返します。 返された関数に対するCallの引数には、レシーバを含めないでください。返された関数は常にvをレシーバとして使用します。 メソッドが見つからない場合、ゼロ値を返します。
func (Value) NumMethod ¶
NumMethodは値のメソッドセット内のメソッド数を返します。
インターフェース型では、エクスポートされたメソッドと非エクスポートされたメソッドの数を返します。 インターフェース以外の型では、エクスポートされたメソッドの数を返します。
func (Value) OverflowComplex ¶
func (v Value) OverflowComplex(x complex128) bool
OverflowComplex は complex128 型の x が v の型で表現できないかどうかを報告します。 もし v の Kind が Complex64 または Complex128 でない場合は、パニックを起こします。
func (Value) OverflowFloat ¶
OverflowFloatは、float64のxがvの型で表現できない場合にtrueを返します。 vの種類がFloat32またはFloat64でない場合、パニックを発生させます。
func (Value) OverflowInt ¶
OverflowInt は、int64型のxがvの型で表現できない場合にtrueを返します。 vのKindがInt、Int8、Int16、Int32、またはInt64でない場合はパニックを発生させます。
func (Value) OverflowUint ¶
OverflowUintはuint64 xがvの型で表現できないかどうかを報告します。 vのKindがUint、Uintptr、Uint8、Uint16、Uint32、またはUint64でない場合は、panicします。
func (Value) Pointer ¶
Pointerはvの値をuintptrとして返します。 vの種類がChan、Func、Map、Pointer、Slice、またはUnsafePointerでない場合はパニックが発生します。
vの種類がFuncの場合、返されるポインタは基礎となるコードポインタですが、 単一の関数を一意に識別するために必要なものではありません。 ただし、結果がゼロであることは、vがnilのfunc Valueである場合に限ります。
vの種類がSliceの場合、返されるポインタはスライスの最初の要素へのポインタです。 スライスがnilの場合、返される値は0です。 スライスが空で非nilの場合、返される値は0でない値です。
同等の結果を得るには、uintptr(Value.UnsafePointer())を使用することが推奨されます。
func (Value) Recv ¶
Recv はチャネル v から値を受信して返します。 v の Kind が Chan でない場合、パニックが発生します。 受信は値が準備されるまでブロックされます。 boolean 値 ok は、値 x がチャネル上の送信に対応する場合は true、チャネルが閉じられているために受信したゼロ値の場合は false です。
func (Value) Send ¶
Sendはチャネルvにxを送信します。 vの種類がChanでないか、xの型がvの要素の型と異なる場合、パニックを引き起こします。 Go言語のように、xの値はチャネルの要素の型に代入可能でなければなりません。
func (Value) Set ¶
Setはxに値vを割り当てます。 CanSetがfalseを返す場合、パニックを発生させます。 Go言語と同様に、xの値はvの型に割り当て可能であり、 非公開フィールドから派生していない必要があります。
func (Value) SetCap ¶ added in v1.2.0
SetCapはvの容量をnに設定します。 vの種類がSliceでない場合や、nがスライスの長さより小さく、 スライスの容量よりも大きい場合は、パニックを引き起こします。
func (Value) SetComplex ¶
func (v Value) SetComplex(x complex128)
SetComplex は v の基礎値を x に設定します。 もし v の Kind が Complex64 や Complex128 ではない場合、または CanSet() が false の場合はパニックになります。
func (Value) SetFloat ¶
SetFloatはvの基底値をxに設定します。 vのKindがFloat32またはFloat64でない場合、またはCanSet()がfalseの場合、パニックが発生します。
func (Value) SetInt ¶
SetIntはvの基になる値をxに設定します。 vのKindがInt, Int8, Int16, Int32, Int64でない場合、またはCanSet()がfalseの場合、パニックとなります。
func (Value) SetIterKey ¶ added in v1.18.0
SetIterKeyはiterの現在のマップエントリのキーをvに割り当てます。 これはv.Set(iter.Key())と同等ですが、新しいValueを割り当てることを回避します。 Goと同様に、キーはvの型に割り当て可能である必要があり、 非公開フィールドから派生していない必要があります。
func (Value) SetIterValue ¶ added in v1.18.0
SetIterValue は iter の現在のマップエントリの値を v に割り当てます。 v.Set(iter.Value()) と同等ですが、新しい Value を割り当てることを避けます。 Go と同様に、値は v の型に割り当て可能である必要があり、 非公開フィールドから派生していない必要があります。
func (Value) SetLen ¶
SetLenはvの長さをnに設定します。 vのKindがSliceでない場合や、nが負の値であるか スライスの容量よりも大きい場合には、パニックを発生させます。
func (Value) SetMapIndex ¶
SetMapIndexはマップv内のキーに関連付けられている要素をelemに設定します。 vのKindがMapでない場合はパニックを発生させます。 elemがゼロ値の場合、SetMapIndexはマップからキーを削除します。 さらに、vがnilのマップを保持している場合は、SetMapIndexはパニックを発生させます。 Go言語と同様に、keyのelemはマップのキーの型に割り当て可能でなければならず、 elemの値はマップのelemの型に割り当て可能でなければなりません。
func (Value) SetPointer ¶
SetPointerは、[unsafe.Pointer]の値であるvをxに設定します。 vの種類がUnsafePointerでない場合、パニックを起こします。
func (Value) SetString ¶
SetStringはvの基礎となる値をxに設定します。 vのKindがStringでない場合、またはCanSet()がfalseの場合はパニックを発生させます。
func (Value) SetUint ¶
SetUintはvの基になる値をxに設定します。 vの種類がUint、Uintptr、Uint8、Uint16、Uint32、またはUint64でない場合、またはCanSet()がfalseの場合はパニックを起こします。
func (Value) SetZero ¶ added in v1.20.0
func (v Value) SetZero()
SetZeroはvをvの型のゼロ値に設定します。 CanSetがfalseを返す場合はパニックを発生させます。
func (Value) Slice ¶
Sliceはv[i:j]を返します。 vのKindが配列、スライス、または文字列でない場合、またはvがアドレス指定できない配列、またはインデックスが範囲外の場合はpanicします。
func (Value) Slice3 ¶ added in v1.2.0
Slice3はスライス操作の3つのインデックス形式です:v[i:j:k]を返します。 もしvの種類がArrayまたはSliceでない場合、またはvがアドレス不可能な配列である場合、 もしくはインデックスが範囲外の場合、panicを発生させます。
func (Value) String ¶
Stringは、文字列vの基礎となる値を文字列として返します。 Stringは、GoのStringメソッドの規約による特別なケースです。 他のゲッターと異なり、vのKindがStringでない場合でもエラーにはなりません。 代わりに、"<T value>"という形式の文字列を返します。ここで、Tはvの型です。 fmtパッケージは、Valueを特別扱いします。暗黙的にStringメソッドを呼び出さず、代わりに保持している具体的な値を表示します。
func (Value) TryRecv ¶
TryRecvはチャネルvから値を受信しようとしますが、ブロックしません。 vのKindがChanでない場合、パニックが発生します。 受信が値を配信する場合、xは転送された値であり、okはtrueです。 ブロックすることなく受信を完了できない場合、xはゼロ値であり、okはfalseです。 チャネルが閉じられている場合、xはチャネルの要素型のゼロ値であり、okはfalseです。
func (Value) TrySend ¶
TrySend はチャネル v に x を送信しようと試みますが、ブロックしません。 v の種類が Chan でない場合は、パニックを発生させます。 値が送信されたかどうかを報告します。 Go のように、x の値はチャネルの要素型に割り当て可能である必要があります。
func (Value) Uint ¶
Uintはvの基礎値をuint64として返します。 vのKindがUint、Uintptr、Uint8、Uint16、Uint32、またはUint64でない場合にはパニックを発生させます。
func (Value) UnsafeAddr ¶
UnsafeAddrはvのデータへのポインタを、uintptrとして返します。 vがアドレス可能でない場合、panicします。
同等の結果を得るためには、uintptr(Value.Addr().UnsafePointer())を使用することが推奨されます。
func (Value) UnsafePointer ¶ added in v1.18.0
UnsafePointerはvの値を[unsafe.Pointer]として返します。 vのKindがChan、Func、Map、Pointer、Slice、またはUnsafePointerでない場合はパニックを発生させます。
vのKindがFuncの場合、返されるポインタは基礎となるコードポインタですが、必ずしも単一の関数を一意に識別するためのものではありません。 唯一の保証は、vがnil func Valueである場合にのみ結果がゼロであることです。
vのKindがSliceの場合、返されるポインタはスライスの最初の要素へのポインタです。スライスがnilの場合、返される値もnilです。 スライスが空であるが非nilの場合、返される値は非nilです。
type ValueError ¶
ValueErrorは、ValueメソッドがサポートされていないValueに対してValueメソッドが呼び出された場合に発生します。このような場合は、各メソッドの説明に記載されています。
func (*ValueError) Error ¶
func (e *ValueError) Error() string