Go語言中雖然沒有傳統面嚮對象語言中類、集成的概念,不過提供了接口的支持,可使用接口來使用一些面向對象的特性。數組
在 go 語言中,的接口有下面幾個特色:code
定義方式以下:對象
type Namer interface { method1(param_list) return_list method2(param_list) return_list ... }
這裏的 Namer 就是接口的名字,只要符合標識符的規則便可。不過,一般約定的接口的名字最好以 er, r, able 結尾(視狀況而定),這樣一眼就知道它是接口。接口
在 go 中實現接口很簡單,不須要顯式的聲明實現了某個接口,想要實現某個接口,只須要實現接口中的全部方法便可。文檔
package main import "fmt" import "math" type Shaper interface { Area() float32 Circumference() float32 } type Rect struct { Width float32 Height float32 } type Circle struct { Radius float32 } func (r Rect) Area() int { return r.Width * r.Height } func (r Rect) Circumference() int { return 2 * (r.Width + r.Height) } func (c Circle) Area() int { return math.Pi * c.Radius * c.Radius } func (c Circle) Circumference() int { return math.Pi * 2 * c.Radius } func main() { r := Rect{10, 20} fmt.Printf("Rect w: %f, d: %f, Area: %f, Circumference: %f", r.Width, r.Height, r.Area(), r.Circumference()) c := Circle{5} fmt.Printf("Circle r: %f, Area: %f, Circumference: %f", c.Radius, c.Area(), c.Circumference()) }
上面咱們定義了一個 Shaper 的接口,其中包含兩個方法 Area 和 Circumference,分別用來計算面積和周長。而後咱們定義了兩個結構體 Rect, Circle 並分別實現了這兩個方法。可是上面的程序彷佛並無體現出接口和兩個實現類型的關係,下面咱們將他們關聯起來使用:it
func showInfo(s Shaper) { fmt.Printf("Area: %f, Circumference: %f", s.Area(), s.Circumference()) }
注意,這裏方法的參數是一個接口類型的,所以咱們能夠將實現接口的類型的實例傳遞進去,像下面這樣:io
r := Rect{10, 20} showInfo(r) c := Circle{5} showInfo(c)
在上面的 showInfo 中咱們傳入了接口類型的對象,若是將實現了接口的類型傳遞進去,那麼會將實際類型的其餘特性掩蓋住,所以一般咱們會想要獲取其真正的類型, 可使用下面的方法:class
func showInfo(s Shaper) { switch s.(type) { case Rect: fmt.Println("This is Rect") case Circle: fmt.Println("This is Circle") } fmt.Printf("Area: %f, Circumference: %f\n", s.Area(), s.Circumference()) }
另外可使用類型斷言,來判斷某一時刻接口是不是某個具體類型import
v, ok := s.(Rect) // s 是一個接口類型
若是 s 此時其實是 Rect 類型,那麼會將 s 轉換爲 Rect 類型,而且 ok 爲 true。不然 ok 爲 false。float
這兩個接口定義了實現io功能的基本操做,所以某種類型只要實現了這兩個接口就能夠進行io操做。
Reader 接口的定義爲:
type Reader interface { Read(p []byte) (n int, err error) }
僅僅只有這一個方法,Read方法將從數據流中讀取 len(p) 個字節的數據到字節數組 p 中,而且返回讀取的字節數(即便發生了錯誤,n也會返回已經讀取的字節數)。
咱們可能會常常用到的實現了 Reader 接口的對象有: os.Stdin(標準輸入), os.File的實例(文件對象)等等, 咱們能夠對其調用 Read 方法來讀取數據。
Writer 接口的定義:
type Writer interface { Write(p []byte) (n int, err error) }
Write 將 len(p) 個字節的數據從 p 中寫入到基本數據流中。寫入的字節數 n(0 <= n <= len(p))以及任何遇到的引發寫入提早中止的錯誤。
相似的實現了 Writer 接口的對象有: os.Stdout, os.Stderr, os.File 等等。可使用 Write 方法向其中寫入數據。
標準庫中定義了不少的接口,這裏只是簡單的提一下,更多內容仍是要去查看標準庫的文檔。