reflect.ValueOf
, reflect.Value.Elem
を組み合わせるとできる。
(この方法はユーザー定義の型ではなく、言語がデフォルトで用意する型を判別するもの)
package main
import (
"fmt"
"reflect"
)
func check(i interface{}) {
// interfaceのValueインスタンスを取得
v1 := reflect.ValueOf(i)
// ポインタの場合、さらにその先にある型を取得する処理に進む
if v1.Kind() == reflect.Ptr {
// Elemを利用して、ポインタの先のValueインスタンスを取得
v2 := reflect.ValueOf(v1.Elem())
// Kindを呼ぶと、ポインタの先にある型情報が得られる
fmt.Println(v2.Kind())
}
}
type Foo struct {}
func main() {
s := Foo{}
check(&s) // struct
}