リフレクション値オブジェクト (reflect.Value) は、次の表に示すように、ゼロ値と空の判定のための一連のメソッドを提供します。
方法 | 説明する | |
---|---|---|
IsNil() bool | 戻り値が nil かどうか。値の型がチャネル (チャネル)、関数、インターフェイス、マップ、ポインター、またはスライスではない場合、言語層のv== nil 操作と同様にパニックが発生します。 |
|
IsValid() bool | 値が有効かどうかを判断します。値自体が不正な場合、reflect Value に値が含まれていない、値が nil であるなど、false を返します。 |
次の例では、さまざまな種類の null ポインターについて IsNil() および IsValid() の戻り値をチェックします。同時に、構造体メンバーの戻り値とメソッド検索マップのキーと値のペアに対して IsValid() の判定を行います。以下のコードを参照してください。
反映された値オブジェクトのゼロおよび有効性チェック:
package main
import (
"fmt"
"reflect"
)
func main() {
// *intの空ポインタ
var a *int
fmt.Println("var a *int:", reflect.ValueOf(a).IsNil())
// nil値
fmt.Println("nil:", reflect.ValueOf(nil).IsValid())
// *int型の空ポインタ
fmt.Println("(*int)(nil):", reflect.ValueOf((*int)(nil)).Elem().IsValid())
// 構造体のインスタンス化
s := struct{}{}
// 存在しないフィールドの検索の試み
fmt.Println("存在しない構造体のメンバー:", reflect.ValueOf(s).FieldByName("").IsValid())
// 存在しないメソッドの検索の試み
fmt.Println("存在しない構造体のメソッド:", reflect.ValueOf(s).MethodByName("").IsValid())
// マップのインスタンス化
m := map[int]int{}
// 存在しないキーの検索の試み
fmt.Println("存在しないキー:", reflect.ValueOf(m).MapIndex(reflect.ValueOf(3)).IsValid())
}
コードの説明は次のとおりです。
- 11 行目では、初期値が nil の *int 型のポインターを宣言しています。
- 12行目では変数aをreflect.Valueとしてラップして空かどうかを判定していますが、このとき変数aはnullポインタなのでtrueを返します。
- 15行目ではnilに対してIsValid()の判定(妥当性判定)を行い、falseを返します。
- 18 行目の (*int)(nil) の意味は、nil を *int、つまり *int 型の null ポインタに変換することです。この行は nil を *int 型に変換し、要素へのポインターを受け取ります。 nil はどの要素も指しておらず、*int 型の nil はどの要素も指すことができないため、値は無効です。したがって、Isvalid()で判定した場合、この反映値はfalseを返します。
- 行 21 では構造体をインスタンス化します。
- 24 行目では、FieldByName を通じて s 構造体の空の文字列のメンバーを検索します。メンバーが存在しない場合、IsValid() は false を返します。
- 27 行目で、MethodByName を使用して s 構造体の空の文字列を含むメソッドを検索します。メソッドが存在しない場合、IsValid() は false を返します。
- 行 30 はマップをインスタンス化します。これは、make によって作成されたマップと同等です。
- 33 行目では、MapIndex() メソッドは、指定された Reflect.Value タイプの値に従ってマップを検索し、見つかった結果を返します。
IsNil() はポインターが空かどうかを判断するためによく使用され、IsValid() は戻り値が有効かどうかを判断するためによく使用されます。
「 Go言語 IsNil() と IsValid() – リフレクション値の無効と有効性を判断する」についてわかりやすく解説!絶対に観るべきベスト2動画
【セイト先生】Go言語使う企業が増えてるって本当!?Go言語を使う企業の特徴は??#エンジニア #プログラミング #Go
囲碁クラス: 33 リフレクション