【学習golangシリーズ】golangのインターフェース

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

[amazonjs asin=”B06XJ86BFZ” locale=”JP” title=”プログラミング経験者がGo言語を本格的に勉強する前に読むための本”]

複雑にしようとするといくらでも複雑にできるので、一番シンプルな形で。

golangのインターフェースはメソッドの集まりを定義するもの。
以下の例では、SystemAとSystemBという2つのインターフェースを定義している。

SystemAにはcallIdとcallNameという2つのメソッドを定義していて、
SystemBにはcallIdのメソッドのみ定義している。
実行する際にはSystemAからはcallId、callNameの両方のメソッドを呼び出せるが、
SystemBからはcallIdのメソッドのみしか呼び出すことができない。

package main

import (
    "fmt"
)

type SystemA interface {
    callId()
    callName()
}

type SystemB interface {
    callId()
}

// Meiboの構造体
type Meibo struct {
    id int
    name string
}

// Meibo構造体のコンストラクタ
func NewMeibo(id int, name string) *Meibo {

    meibo := &Meibo{

        id: id,
        name: name,
    }

    return meibo
}

// MeiboのIDを表示するMeibo構造体のメソッド
func (m Meibo) callId(){

    fmt.Println(m.id)
}

// Meiboの名前を表示するMeibo構造体のメソッド
func (m Meibo) callName(){

    fmt.Println(m.name)
}

func main(){

    // Meiboコンストラクタでmeibo構造体オブジェクトを作成する
    meibo := NewMeibo(1, "umentu")

    // SystemAインターフェースにmeibo構造体オブジェクトを設定する
    var system_a SystemA = meibo
    // SystemBインターフェースにmeibo構造体オブジェクトを設定する
    var system_b SystemB = meibo

    // SystemAにcallIdが登録されているから実行できる
    system_a.callId()
    // SystemAにcallNameが登録されているから実行できる
    system_a.callName()

    // SystemBにcallIdが登録されているから実行できる
    system_b.callId()
    // SystemBにcallNameが登録されていないから実行できない
    //system_b.callName()
}