今川館

都内勤務の地味OLです

Goはパッケージトップレベルの関数をreflectで取り出せない

ことの始まりはtimeモジュールのFormat()の挙動が理解できなかったことなのだが、
time.nextStdChunkという関数をどうしても実行したくなり、reflectで取り出そうとしてはまった。

まず、小文字で始まる名前をつけたものは同一パッケージ内からしかアクセスできない。

なので、time.nextStdChunkはtimeパッケージ外から利用できない。

そういうとき、リフレクションを使えばnextStdChunkを取り出せるだろうと思いreflectパッケージの使い方を調べたのだが、以下のコードが動かなくて困った。

import "reflect"
import "time"

reflect.ValueOf(time)  // これができない

どうやら、↓こんな難しいことしないとダメらしい。

Adventures in Go: Accessing Unexported Functions
http://www.alangpierce.com/blog/2016/03/17/adventures-in-go-accessing-unexported-functions/

go getで利用できるようにGithubに上げてあった
https://github.com/alangpierce/go-forceexport

Pythonだとモジュールもインポートしたらただのオブジェクトみたいに使えて、トップレベルに定義したものも難なく取り出せるので意外だった。