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