【Golang】Reflectionとは?どうやって使うのか解説!

Golang

リフレクションとは高度なプログラミングの概念で、いくつかのプログラミング言語では、プログラムが実行時に型や値をチェックすることを可能にします。

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
}
タイトルとURLをコピーしました