目錄

Interfaces and Duck Typing in Go

If it looks like a duck and quacks like a duck, it’s a duck

Interfaces and Duck Typing in Go

if it looks like a duck and quacks like a duck, it’s a duck 當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子

/zh-tw/duck_typing/cartoon_duck.jpg source: https://theburningmonk.com/2015/05/why-i-like-golang-interfaces/

意思就是: 一個東西究竟是不是鴨子,取決於它能不能滿足鴨子的工作。

duck typing 多出現在動態語言, 例如PHP, Python, JavaScript, Ruby 等. 在靜態語言中比較罕見,但是在go中duck typing處處都是duck typing.

Go isn’t object oriented in the typical sense 更多解釋可以看這 Is go duck-typed? go的 interface{} 和 duck typing 密不可分. 後面會有 example 來實現.

Duck Typing

duck typing 描述事物的外部行為而非內部結構 在物件導向(Object-oriented programming, OOP)的編程語言中,當某個地方(比如某個函數的參數)需要符合某個條件的變量(比如要求這個變量實現了某種方法)時,什麼是判斷這個變量是否"符合條件"的標準? 如果某種語言在這種情況下的標準是: 這個變量的類型是否實現了這個要求的方法(並不要求顯式地聲明),那麼這種語言的類型系統就可以稱為duck typing duck typing是動態類型的一種風格。在這種風格中,一個對象有效的語義,不是由繼承自特定的類或實現特定的接口,而是由"當前方法和屬性的集合"決定。 誰調用誰實現,比如你要調用一個A函數,而A函數中接收參數的同時調用了參數中的B方法.這時候你就要傳進去一個具有B方法名的一個對象.

Go interface

Understanding Interfaces in Go

Example

Python : duck-typing-in-python/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package main

import "fmt"

// 定義一個 Duck interface
// Go interface 是一組方法的集合,可以理解為抽象的類型。
// 它提供了一種非侵入式的interface
// 任何類型,只要實現了該interface 中方法集,那麼就屬於這個類型。
type Duck interface {
	Gaga()
}

type RealDuck struct{}

// Realduck 聲明方法來實現 interface 的 Gago
func (rd RealDuck) Gaga() {
	fmt.Println("this is Real Duck")
}

// 唐老鴨類型
type DonaldDuck struct{}

// 唐老鴨聲明方法來實現 interface 的 Gago
func (dd DonaldDuck) Gaga() {
	fmt.Println("this is DoningdDuck")
}

// 負責執行鴨子能做的事情,注意這裡的參數,有類型限制為 Duck interface
func DuckSay(d Duck) {
	d.Gaga()
}

func main() {
	fmt.Println("duck typing")
  
	var rd RealDuck
	var dd DonaldDuck

	rd.Gaga()
	dd.Gaga()
	DuckSay(rd)
	DuckSay(dd)
}

/*
duck typing
this is Real Duck
this is DoningdDuck
this is Real Duck
this is DoningdDuck
*/

Reference