LoginSignup
10
1

More than 5 years have passed since last update.

Go言語における構造体とInterfaceの利用

Last updated at Posted at 2018-07-01

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がその関係になる。

10
1
0

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
10
1