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)) // "ガーガー"
}
7kaji7kaji

Ruby でのダックタイピングの例

class Dog
  def say
    'ワンワン'
  end
end

class Duck
  def say
    'ガーガー'
  end
end

class Human
  def touch(animal)
    animal.say
  end
end

human = Human.new
dog   = Dog.new
duck  = Duck.new

puts human.touch(dog)    # "ワンワン"
puts human.touch(duck)   # "ガーガー"

REF: Rubyでcase文を卒業してダックタイピングに入門する - Qiita https://qiita.com/ksss/items/1659d53c39c4cad11bdc#ダックとともにあれ

Hidden comment
このスクラップは2023/04/06にクローズされました