LoginSignup
4

More than 5 years have passed since last update.

Goでパッケージ外非公開の構造体フィールドを参照する

Last updated at Posted at 2015-04-24

golangでパッケージ外非公開の構造体フィールドを無理矢理に取得してくる方法です。
実例としてwebsocket.Connrwcがほしいケースがあったのでそれを参考に。
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のお作法がわかっていないのでもっといい方法があれば教えてもらえると嬉しいです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4