go語言學習-介面

來源:互聯網
上載者:User

標籤:info   out   stdout   方法   byte   write   不包含   整合   span   

Go語言中雖然沒有傳統物件導向語言中類、整合的概念,不過提供了介面的支援,可以使用介面來使用一些物件導向的特性。

在 go 語言中,的介面有下面幾個特點:

  • 可以包含0個或多個方法的簽名
  • 只定義方法的簽名,不包含實現
  • 實現介面不需要顯式的聲明,只需實現相應方法即可
介面的定義

定義方式如下:

type Namer interface {    method1(param_list) return_list    method2(param_list) return_list    ...}

這裡的 Namer 就是介面的名字,只要符合標識符的規則即可。不過,通常約定的介面的名字最好以 er, r, able 結尾(視情況而定),這樣一眼就知道它是介面。

實現介面

在 go 中實現介面很簡單,不需要顯式的聲明實現了某個介面,想要實現某個介面,只需要實現介面中的所有方法即可。

package mainimport "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 並分別實現了這兩個方法。但是上面的程式似乎並沒有體現出介面和兩個實作類別型的關係,下面我們將他們關聯起來使用:

func showInfo(s Shaper) {    fmt.Printf("Area: %f, Circumference: %f", s.Area(), s.Circumference())}

注意,這裡方法的參數是一個介面類型的,因此我們可以將實現介面的類型的執行個體傳遞進去,像下面這樣:

r := Rect{10, 20}showInfo(r)c := Circle{5}showInfo(c)
擷取實現介面的實際類型

在上面的 showInfo 中我們傳入了介面類型的對象,如果將實現了介面的類型傳遞進去,那麼會將實際類型的其他特性掩蓋住,因此通常我們會想要擷取其真正的類型, 可以使用下面的方法:

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())}

另外可以使用類型斷言,來判斷某一時刻介面是否是某個具體類型

v, ok := s.(Rect)   // s 是一個介面類型

如果 s 此時實際上是 Rect 類型,那麼會將 s 轉換為 Rect 類型,並且 ok 為 true。否則 ok 為 false。

標準庫中的常用介面io.Reader 和 io.Writer

這兩個介面定義了實現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 方法向其中寫入資料。

標準庫中定義了很多的介面,這裡只是簡單的提一下,更多內容還是要去查看標準庫的文檔。

go語言學習-介面

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.