リフレクションとは高度なプログラミングの概念で、いくつかのプログラミング言語では、プログラムが実行時に型や値をチェックすることを可能にします。
Golangにはリフレクションのためのパッケージであるreflectパッケージがあります。この記事では、
Golangでリフレクションを行う方法について説明します。
目次
プログラミングにおけるリフレクションとは?
リフレクションとは、プログラミング言語が実行時に値の型を確認する方法のことである。
Go言語にはreflectパッケージがあり、これを使うとGoで実行時リフレクションを行うことができます。
GoLangでreflectパッケージをインポートする
Golangでリフレクションを行うには、reflectパッケージをインポートする必要があります。
import "reflect"
reflectパッケージについて
reflectパッケージは、リフレクションに使えるすべての関数が含まれているものです。
ここでは、その一部を紹介します。
runtime型を取得する
reflect.TypeOfを使って、値の型をランタイムに取得することができます。
package main
import (
"fmt"
"reflect"
)
type Person struct{
Name string
Age int
}
func main() {
p := Person{"Tanaka", 20}
fmt.Println(reflect.TypeOf(p)) // main.Person
}
ランタイムで値を取得する
package main
import (
"fmt"
"reflect"
)
type Person struct{
Name string
Age int
}
func main() {
p := Person{"Tanaka", 20}
fmt.Println(reflect.ValueOf(p)) // {Tanaka 20}
}
構造体のフィールド数の取得
NumField関数は、構造体が持つフィールドの数を返します。
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func main() {
p := Person{"Tanaka", 20}
fmt.Println(reflect.ValueOf(p).NumField()) // 2
}
メソッド数の取得
NumMethod関数は、構造体が含むメソッドの数を返します。
package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func (p Person) GetName() string {
return p.Name
}
func main() {
p := Person{"Tanaka", 20}
fmt.Println(reflect.TypeOf(p).NumMethod()) // 1
}
IsValid() メソッド
値であるかどうかを確認するには、isValid メソッドを使用することができます。
package main
import (
"fmt"
"reflect"
)
type Person struct{
Name string
Age int
}
func main() {
p := Person{"Tanaka", 20}
fmt.Println(reflect.ValueOf(p).IsValid()) // true
}
Kind() メソッド
また、値の種類は、以下のようにkind関数を用いて抽出することができる。
package main
import (
"fmt"
"reflect"
)
type Person struct{
Name string
Age int
}
func main() {
p := Person{"Tanaka", 20}
fmt.Println(reflect.TypeOf(p).Kind()) // struct
}