ホーム プログラミング言語 golang go reflect Go言語 IsNil() と IsValid() – リフレクション値の無効と有効性を判断する






Go言語 IsNil() と IsValid() – リフレクション値の無効と有効性を判断する




 
 
リフレクション値オブジェクト (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 リフレクション