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) リフレクション チュートリアル