Closed5

Go の Interface

7kaji7kaji

Go言語にはインタフェースがある。明示的に実装しなくてもインタフェースが定義するメソッドをすべて実装していれば、そのインタフェースを実装していることになる(ダックタイピング)。

REF: Go言語における埋め込みによるインタフェースの部分実装パターン - Qiita https://qiita.com/tenntenn/items/e04441a40aeb9c31dbaf

7kaji7kaji

ダックタイピングとは

「ダックタイピング」の名前の由来は「アヒルのように歩き、アヒルのように鳴くものはアヒルに違いない」という言い回しから来ている。
「それ」がアヒルのように歩きアヒルのように鳴きさえするなら、もし「それ」が実は魚のように泳ぐこともできて、蛇のように地を這うことがあったとしても、「それ」はアヒルとして扱って何ら問題なかろう、ということだ。

つまり、
Go言語ではinterfaceを使った型の制限が可能で、逆にinterface定義において宣言したメソッドをすべて満たすstructを作れば、それはそのinterfaceを満たす型として扱える。これがダックタイピング。

REF: ダックタイピングって一体なんなのよ【golang】 - DRYな備忘録 https://otiai10.hatenablog.com/entry/2014/01/15/210445

7kaji7kaji

Go での Interface の例

package main

import "fmt"

// say メソッドを生やさないとエラーになる
type animal interface {
    say() string
}

type dog struct {
}

func (d dog) say() string {
    return "ワンワン"
}

type duck struct {
}

func (d duck) say() string {
    return "ガーガー"
}

type human struct {
}

func (h human) touch(a animal) string {
    return a.say()
}

func main() {
    // インターフェースの型を持つ変数に, インターフェースを満たす構造体は代入できる
    var dog animal = dog{}
    var duck animal = duck{}

    human := human{}
    fmt.Println(human.touch(dog))  // "ワンワン"
    fmt.Println(human.touch(duck)) // "ガーガー"
}
Hidden comment
このスクラップは2023/04/06にクローズされました