golangでパッケージ外非公開の構造体フィールドを無理矢理に取得してくる方法です。
実例としてwebsocket.Conn
のrwc
がほしいケースがあったのでそれを参考に。
https://godoc.org/golang.org/x/net/websocket
func getNetConn(ws *websocket.Conn) (n net.Conn) {
v := reflect.ValueOf(ws).Elem().FieldByName("rwc")
if !v.CanAddr() {
log.Fatalf("Can't addr")
}
// アドレスからnet.Conn型に変換
n = (*(*interface {M()})(unsafe.Pointer(v.UnsafeAddr()))).(net.Conn)
return
}
reflect
パッケージを使ってrwc
のValueをとってきます。
net.Conn
にキャストしたいのですがInterface()
はunexportedな構造体メンバに使えないので一旦アドレスに変換。
reflect
内のコードを参考にして無理くりにやってみました。
なんか将来的にできなくなりそうな臭いもしますが…。golang 1.3では動くみたいです。
golangだとそもそもこういうことをすべきではない、ライブラリを直してもらうべき、という話なんでしょか。
golangのお作法がわかっていないのでもっといい方法があれば教えてもらえると嬉しいです。