ホーム プログラミング言語 golang go reflect Go言語reflect.Elem() – リフレクションを通じてポインタが指す要素の型を取得します






Go言語reflect.Elem() – リフレクションを通じてポインタが指す要素の型を取得します




 
 
Go 言語プログラムでポインターのリフレクション オブジェクトを取得する場合、ポインターが指す要素の型は、reflect.Elem() メソッドを通じて取得できます。この取得処理を要素取得と呼び、ポインタ型変数に対して*演算を行うのと同じで、コードは次のようになります。

 

package main

import (
    "fmt"
    "reflect"
)

func main() {

    // 空の構造体を宣言します
    type cat struct {
    }

    // catのインスタンスを作成します
    ins := &cat{}

    // 構造体インスタンスの反射型オブジェクトを取得します
    typeOfCat := reflect.TypeOf(ins)

    // 反射型オブジェクトの名前と種類を表示します
    fmt.Printf("name:'%v' kind:'%v'\n",typeOfCat.Name(), typeOfCat.Kind())

    // 型の要素を取得します。
    typeOfCat = typeOfCat.Elem()

    // 反射型オブジェクトの名前と種類を表示します
    fmt.Printf("element name: '%v', element kind: '%v'\n", typeOfCat.Name(), typeOfCat.Kind())

} 

コード出力は次のとおりです。

name: ”  kind: ‘ptr’
element name: ‘cat’, element kind: ‘struct’

コードの説明は次のとおりです。

  • 15 行目では、cat 構造体のインスタンスが作成され、ins は *cat 型のポインター変数です。
  • 18行目でポインタ変数のリフレクション型情報を取得しています。
  • 21行目、型名とポインタ変数の型を出力します。 Go 言語を反映して、すべてのポインター変数の型は Ptr ですが、ポインター変数の型名は *cat ではなく空であることに注意してください。
  • 24行目ではポインタ型の要素型、つまりcat型を取得しています。この操作は元に戻すことができず、そのポインター型を非ポインター型から取得することはできません。
  • 27行目では出力ポインタ変数が型名と要素の型を指しており、catの型名(cat)と型(struct)を取得しています。
 

「 Go言語reflect.Elem() – リフレクションを通じてポインタが指す要素の型を取得します」についてわかりやすく解説!絶対に観るべきベスト2動画

Smart Go: Intro to reflection, or data type information at runtime
Go (Golang) リフレクション チュートリアル