Closed5
Go の Interface
Go言語にはインタフェースがある。明示的に実装しなくてもインタフェースが定義するメソッドをすべて実装していれば、そのインタフェースを実装していることになる(ダックタイピング)。
REF: Go言語における埋め込みによるインタフェースの部分実装パターン - Qiita https://qiita.com/tenntenn/items/e04441a40aeb9c31dbaf
ダックタイピングとは
「ダックタイピング」の名前の由来は「アヒルのように歩き、アヒルのように鳴くものはアヒルに違いない」という言い回しから来ている。
「それ」がアヒルのように歩きアヒルのように鳴きさえするなら、もし「それ」が実は魚のように泳ぐこともできて、蛇のように地を這うことがあったとしても、「それ」はアヒルとして扱って何ら問題なかろう、ということだ。
つまり、
Go言語ではinterfaceを使った型の制限が可能で、逆にinterface定義において宣言したメソッドをすべて満たすstructを作れば、それはそのinterfaceを満たす型として扱える。これがダックタイピング。
REF: ダックタイピングって一体なんなのよ【golang】 - DRYな備忘録 https://otiai10.hatenablog.com/entry/2014/01/15/210445
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)) // "ガーガー"
}
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#ダックとともにあれ
このスクラップは2023/04/06にクローズされました