お世話になっております。
しゃまとんです。

ふと、golangでもこんな感じでメソッドって呼べないのかなーと調べてみたんですが、そんないい話はありませんでした。

Goではreflectというパッケージでリフレクションすることができるようになっています(説明になっていない)。 そちらでやりたげなことは出来そうなんですが、reflectは重いという噂から、どうなんだろうということで簡単に比較してみました。

golangで文字列的にメソッドを呼ぶにはreflect.MethodByNameを利用して実現できそうです。いけるかな、いけないかな。

さて、検証簡単にベンチマークをとりました。
コードは下記です。

package main

import (
    "testing"
    "reflect"
    "time"
)

var t = time.Now()
var r = reflect.ValueOf(t)

func BenchmarkCall(b *testing.B) {
    for n := 0; n < b.N; n++ {
        t.UnixNano()
    }
}

func BenchmarkReflect(b *testing.B) {
    for n := 0; n < b.N; n++ {
        r.MethodByName("UnixNano").Call(nil)
    }
}

実行結果はこんな感じ。
全然速度違いますね。。

BenchmarkCall-4                          2000000000           0.49 ns/op        0 B/op          0 allocs/op
BenchmarkReflect-4                       1000000          1577 ns/op         192 B/op          7 allocs/op

普通に使っている程度だと、使わないですが込み入ったことをするとreflectが登場してくるので使うときは気をつけないとですね。

以上です。

■ 参考