#Go言語における構造体とInterfaceの利用
##環境
go version go1.9.4
Zorin OS 12.3
##概要
最近、抽象構文木を作るインタプリタの本を読んでいるが構造体にInterfaceを
入れ込んでいる部分で、コードが追いかけられなくなり詰まったので簡単な例を用いて自分のためにここにまとめておく。
###構造体とInterface
作成したのが以下のプログラム。
testcode
package main
import(
"fmt"
)
// Animal構造体
// この中にインターフェースのスライスを定義して、その中に他の動物の構造体を入れる
type AnimalStruct struct{
Animals []Animal
}
// 犬の構造体
type DogStruct struct{
no int
}
func (d *DogStruct)bark(){
fmt.Println("わんわん")
}
// 猫の構造体
type CatStruct struct{
no int
}
func (c *CatStruct)bark(){
fmt.Println("にゃーにゃー")
}
// Baseインターフェース
type Base interface{
bark()
}
// Animalインターフェース
type Animal interface{
Base
}
func main(){
// ベースとなる構造体を定義
BaseStruct := AnimalStruct{}
// 犬の構造体と猫の構造体を生成
dog := DogStruct{no: 100}
cat := CatStruct{no: 101}
// それぞれ追加
BaseStruct.Animals = append(BaseStruct.Animals, &dog)
BaseStruct.Animals = append(BaseStruct.Animals, &cat)
//使ってみる
BaseStruct.Animals[0].bark()
BaseStruct.Animals[1].bark()
// これはできない Interfaceはメソッドだけ持つ
// BaseStruct.Animals[0].no
// BaseStruct.Animals[1].no
// こうやったら使えるようになる
fmt.Println(BaseStruct.Animals[0].(*DogStruct).no)
fmt.Println(BaseStruct.Animals[1].(*CatStruct).no)
}
出力結果
わんわん
にゃーにゃー
100
101
構造体の中にInterface型のスライスを定義して、その中に別の構造体のアドレスを入れ込んでいく。
Interface型スライスを定義することによって、ポリモーフィズムを実現している。
また、Interfaceは継承のようなことができる。上のソースコードでいうとBaseとAnimalStructがその関係になる。