Documentation
¶
Overview ¶
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) Typedeprecated
- func SliceOf(t Type) Type
- func StructOf(fields []StructField) Type
- func TypeFor[T any]() 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 SliceAt(typ Type, p unsafe.Pointer, n int) Value
- 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) Seq() iter.Seq[Value]
- func (v Value) Seq2() iter.Seq2[Value, 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を返します。 その後の MapIter.Key、MapIter.Value、または MapIter.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が返す値は不特定です。 タグが明示的に空の文字列に設定されているかどうかを判断するには、StructTag.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() int FieldAlign() int Method(int) Method MethodByName(string) (Method, bool) NumMethod() int Name() string PkgPath() string Size() uintptr String() string Kind() Kind Implements(u Type) bool AssignableTo(u Type) bool ConvertibleTo(u Type) bool Comparable() bool Bits() int ChanDir() ChanDir IsVariadic() bool Elem() Type Field(i int) StructField FieldByIndex(index []int) StructField FieldByName(name string) (StructField, bool) FieldByNameFunc(match func(string) bool) (StructField, bool) In(i int) Type Key() Type Len() int NumField() int NumIn() int NumOut() int Out(i int) Type OverflowComplex(x complex128) bool OverflowFloat(x float64) bool OverflowInt(x int64) bool OverflowUint(x uint64) bool CanSeq() bool CanSeq2() bool // 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 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メソッドを使用してください。型に適切でないメソッドを呼び出すと、ランタイムパニックが発生します。
ゼロ値は何も表していません。 その Value.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 SliceAt ¶ added in v1.23.0
SliceAtは、基礎となるデータがpで始まり、長さと容量がnと等しいスライスを表す Value を返します。
これは unsafe.Slice のようなものです。
func Zero ¶
Zeroは指定された型のゼロ値を表すValueを返します。 結果はValue構造体のゼロ値とは異なり、値が存在しないことを表します。 例えば、Zero(TypeOf(42))はKindが Int で値が0のValueを返します。 返された値はアドレスを取ることも変更することもできません。
func (Value) Addr ¶
Addrはvのアドレスを表すポインタ値を返します。 Value.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関数は、値のアドレスを Value.Addr で取得できるかどうかを報告します。 このような値は、addressableと呼ばれます。値がaddressableであるとは、 スライスの要素、addressableな配列の要素、addressableな構造体のフィールド、 またはポインタの参照結果である場合を指します。 CanAddrがfalseを返す場合、 Value.Addr を呼び出すとパニックが発生します。
func (Value) CanComplex ¶ added in v1.18.0
CanComplexは Value.Complex をパニックを起こさずに使用できるかどうかを報告します。
func (Value) CanConvert ¶ added in v1.17.0
CanConvertは、値vが型tに変換可能かどうかを報告します。 v.CanConvert(t)がtrueを返す場合、v.Convert(t)はパニックしません。
func (Value) CanFloat ¶ added in v1.18.0
CanFloat は、 Value.Float をパニックせずに使用できるかどうかを報告します。
func (Value) CanInterface ¶
CanInterfaceは、パニックなしで Value.Interface を使用できるかどうかを報告します。
func (Value) CanSet ¶
CanSetはvの値を変更できるかどうかを報告します。 値はアドレス可能であり、非公開の構造体フィールドの使用では 取得されていない場合にのみ変更できます。 CanSetがfalseを返す場合、Setや任意のタイプ固有のセッター(例: Value.SetBool 、 Value.SetInt )を呼び出すとパニックが発生します。
func (Value) CanUint ¶ added in v1.18.0
CanUintは、パニックせずに Value.Uint を使用できるかどうかを報告します。
func (Value) Cap ¶
Cap は v の容量を返します。 v の Kind が Array 、 Chan 、 Slice 、または Array のポインタでない場合、パニックを発生させます。
func (Value) Clear ¶ added in v1.21.0
func (v Value) Clear()
Clearメソッドは、マップの内容をクリアするか、スライスの内容をゼロにします。
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が Interface または Pointer でない場合、パニックが発生します。 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) Grow ¶ added in v1.20.0
Grow increases the slice's capacity, if necessary, to guarantee space for another n elements. After Grow(n), at least n elements can be appended to the slice without another allocation.
It panics if v's Kind is not a Slice or if n is negative or too large to allocate the memory.
func (Value) Index ¶
Indexはvのi番目の要素を返します。 vのKindが Array 、 Slice 、または String でない場合、またはiが範囲外の場合はパニックが発生します。
func (Value) Int ¶
Intはvの基になる値をint64として返します。 vのKindが Int 、 Int8 、 Int16 、 Int32 、または Int64 でない場合、パニックします。
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を返します。 Value.IsValid がfalseを返す場合、Stringを除いた他のメソッドはすべてパニックします。 ほとんどの関数やメソッドは無効な値を返しません。 無効な値を返す場合、そのドキュメントは明示的に条件を説明します。
func (Value) Kind ¶
KindはvのKindを返します。 もしvがゼロ値である場合( Value.IsValid がfalseを返す場合)、KindはInvalidを返します。
func (Value) Len ¶
Lenはvの長さを返します。 vの種類が Array 、 Chan 、 Map 、 Slice 、 String 、または Array のポインタでない場合、パニックを発生させます。
func (Value) MapIndex ¶
MapIndexは、マップv内のキーに関連付けられた値を返します。 vのKindが Map でない場合、パニックを起こします。 キーがマップ内に見つからない場合、またはvがnilマップを表す場合、ゼロ値を返します。 Goと同様に、キーの値はマップのキー型に代入可能でなければなりません。
func (Value) MapKeys ¶
MapKeysは、マップに存在するすべてのキーを含むスライスを返します。 順序は指定されていません。 vのKindが Map でない場合、パニックを起こします。 vがnilマップを表す場合、空のスライスを返します。
func (Value) MapRange ¶ added in v1.12.0
MapRangeはマップの範囲イテレータを返します。 vのKindが Map でない場合、パニックを起こします。
イテレータを進めるには MapIter.Next を呼び出し、各エントリにアクセスするには MapIter.Key/MapIter.Value を呼び出します。 イテレータが終了した場合、MapIter.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 、String、または UnsafePointer でない場合はパニックが発生します。
vの種類が Func の場合、返されるポインタは基礎となるコードポインタですが、 単一の関数を一意に識別するために必要なものではありません。 ただし、結果がゼロであることは、vがnilのfunc Valueである場合に限ります。
vの種類が Slice の場合、返されるポインタはスライスの最初の要素へのポインタです。 スライスがnilの場合、返される値は0です。 スライスが空で非nilの場合、返される値は0でない値です。
vのKindが String である場合、返されるポインタは文字列の基礎となるバイトの最初の要素を指します。
同等の結果を得るには、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) Seq ¶ added in v1.23.0
Seqは、vの要素をループするiter.Seq[Value]を返します。 vの種類がFuncの場合、それは結果を持たず、型func(T) boolの単一の引数を取る 関数でなければなりません。 vの種類がPointerの場合、ポインタ要素の型はArrayでなければなりません。 それ以外の場合、vの種類はInt、Int8、Int16、Int32、Int64、 Uint、Uint8、Uint16、Uint32、Uint64、Uintptr、 Array、Chan、Map、Slice、またはStringでなければなりません。
func (Value) Seq2 ¶ added in v1.23.0
Seq2は、vの要素をループするiter.Seq2[Value, Value]を返します。 vの種類がFuncの場合、それは結果を持たず、 型func(K, V) boolの単一の引数を取る関数でなければなりません。 vの種類がPointerの場合、ポインタ要素の型はArrayでなければなりません。 それ以外の場合、vの種類はArray、Map、Slice、またはStringでなければなりません。
func (Value) Set ¶
Setはxに値vを割り当てます。 Value.CanSet がfalseを返す場合、パニックを発生させます。 Go言語と同様に、xの値はvの型に割り当て可能であり、 非公開フィールドから派生していない必要があります。
func (Value) SetBool ¶
SetBoolはvの基になる値を設定します。 vのKindが Bool でない場合、または Value.CanSet がfalseを返す場合はパニックを発生させます。
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 ではない場合、または Value.CanSet が false の場合はパニックになります。
func (Value) SetFloat ¶
SetFloatはvの基底値をxに設定します。 vのKindが Float32 または Float64 でない場合、または Value.CanSet がfalseの場合、パニックが発生します。
func (Value) SetInt ¶
SetIntはvの基になる値をxに設定します。 vのKindが Int, Int8, Int16, Int32, Int64 でない場合、または Value.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と同様に、キーの要素はマップのキー型に代入可能でなければならず、 要素の値はマップの要素型に代入可能でなければなりません。
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 でない場合、または Value.CanSet がfalseの場合はパニックを起こします。
func (Value) SetZero ¶ added in v1.20.0
func (v Value) SetZero()
SetZeroはvをvの型のゼロ値に設定します。 Value.CanSet がfalseを返す場合はパニックを発生させます。
func (Value) Slice ¶
Sliceはv[i:j]を返します。 vのKindが Array 、 Slice 、または String でない場合、または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 、String、または UnsafePointer でない場合はパニックを発生させます。
vのKindが Func の場合、返されるポインタは基礎となるコードポインタですが、必ずしも単一の関数を一意に識別するためのものではありません。 唯一の保証は、vがnil func Valueである場合にのみ結果がゼロであることです。
vのKindが Slice の場合、返されるポインタはスライスの最初の要素へのポインタです。スライスがnilの場合、返される値もnilです。 スライスが空であるが非nilの場合、返される値は非nilです。
vのKindが String である場合、返されるポインタは文字列の基礎となるバイトの最初の要素を指します。
type ValueError ¶
ValueErrorは、Valueメソッドがサポートされていない Value に対してValueメソッドが呼び出された場合に発生します。このような場合は、各メソッドの説明に記載されています。
func (*ValueError) Error ¶
func (e *ValueError) Error() string