[Go] 任意の構造体が持つ関数を列挙する

作成日: 2021年03月07日

reflect パッケージの関数を組み合わせることで、任意の構造体が持つ関数を列挙することができます。下記の例では、構造体 Hoge が持っている関数名を全て出力します。

package main

import (
    "fmt"
    "reflect"
)

type Hoge struct {
}

func (h *Hoge) First() string {
    return "one"
}

func (h *Hoge) Second() string {
    return "two"
}

func main() {
    h := &Hoge{}

    t := reflect.TypeOf(h)
    for i := 0; i < t.NumMethod(); i++ {
        fmt.Println(t.Method(i).Name)
    }
}

説明

  • reflect.TypeOf() 関数で関数名を取得したい構造体を引数に渡します。返り値として Type 型のデータが返されます。
  • t.NumMethod()h が持つ関数の数を返します。この関数の数だけループを行います。
  • t.Method(i).Name とすることで、i 番目の関数の名前を取得できます。

実行結果

First
Second
Go