2013年9月8日日曜日

Go言語で構造体のメンバを継承する

久しぶりにGo言語関係のトピックです。たまたまTwitterで質問されていたので試してみました。(私も実は知らなかった)ということで、メモしておきます。

Go言語には継承の考え方はないのですが、構造体に別の構造体のメンバを取り込むことができます。
interfaceでもできることは書いてありますが、構造体に関してはドキュメントに明記がないような気はするけど、以下のリンクあたりに構造体のメンバを使うコード例が書かれています。(※英語なので読むのに時間と体力が必要なので今回は軽めにしておきます。)
http://golang.org/ref/spec#Selectors

ちなみにこの辺りの記述なのかもしれません。
http://golang.org/ref/spec#Composite_literals

サンプルコードです。(リンク先は動作確認ができるようになっています)
http://play.golang.org/p/nNV-jUiygC

package main

import "fmt"

type a struct {
 A int
 B float32
}

type b struct {
 a
 C string
 D bool
}

func main() {
 val := b {C: "abcde", D: true}
 val.A = 1
 val.B = 2.5

 fmt.Printf("b.A = %d\n", val.A)
 fmt.Printf("b.B = %f\n", val.B)
 fmt.Printf("b.C = %s\n", val.C)
 fmt.Printf("b.D = %v\n", val.D)
}