golang 基礎(20) 介面

square-gopher.png

interface.jpg
介面
什麼是 interface
提到介面,我們會聯想到汽車的介面,也就是讓司機如何操作汽車按自己意願使用,使用者介面也是介面,會聯想到很多很多。介面看了很多,對初學者比較難理解,但是一旦理解了並可以靈活運用了,介面 power 還是很大的。
介面可以理解是規範、協議、使用者使用手冊和對型別抽象,對行為描述。說了這麼一大堆還需要您自己瞭解。
In object-oriented programming, a protocal or interface is a common means for unrelated objects to communicate with each other
wikipedia
上面的話摘字 wiki,這裡傳遞了兩個資訊
- communicate 介面是用於通訊,介面就是用來定義通訊遵循的規則
- unrelated objects 沒有關係的物件,介面定義通訊規則可以使用兩個互不相干的物件。

1280px-Lego_dimensions.svg.png
樂高玩具就是一個好的例子。樂高玩具的一個piece 組合時只要遵守尺寸規則,無論大小和顏色就可以組合在一起進行拼接。
以後兼職工作也是一樣只要滿足規定的條件,在拼接 Lego 玩具時是否可以拼接是和piece 的顏色和形狀沒有關係的,只要他們都遵守一定尺寸就可以進行拼接。在軟體控制模組搭建和通訊也是通過定義一定介面規範來實現了。我想軟體工程也在某些方面借鑑傳統的行業。
那麼什麼是 go 的 interface
- abstract types
- concrete types
當然在 go 語言中有很多種型別,不過我們大致可以將歸為兩種一種型別屬於 abstract 型別(抽象型別)和 concrete 型別(實體型別)
concrete 型別
- 用於描述型別在記憶體中分配情況
int8/int16/int32/int64/struct/float - 使用方法賦予資料一定的行為
type Number int func (n Number) Positive() bool{ return n >0 }
abstract 型別
抽象型別並沒定義描述如何為這種型別分配記憶體空間,而是描述型別的行為。按行為為型別進行劃分。這些抽象型別有 io.Reader
、 io.Writer
和 fmt.String
等等
type Positiver interface{ Positive() bool }
用來說明 go 語言介面的經典介面 Writer 和 Reader 介面
type Reader interface{ Read(b []byte)(int,error) } type Writer interface{ Writer(b []byte)(int,error) }
只要實現了介面的方法的型別就屬於介面型別,所以集合是普通型別的集合。我們介面是可以組合,但是介面越詳細確定範圍也就小 weak
type ReadWriter interface{ Read Writer }
這裡有一個 interface{}
Rob Pike 指著 interface{}
是沒有任何意思,因為沒有任何限制,沒有限制也就是沒有意義,這個應該不難理解

1200px-Rob-pike-oscon.jpg