📕
Go 語言程式設計入門
  • 最新消息
  • 中文版更新日誌
  • 譯者誌謝
  • 01-起步走
    • 01.01-檔案與資料夾
    • 01.02-終端機(Terminal)
    • 01.03-文字編輯器
    • 01.04-Go 的工具
  • 02-你的第一個程式
    • 02.01-如何讀 Go 程式
    • 02.02-問題
  • 03-型別
    • 03.01-數字
    • 03.02-字串
    • 03.03-問題
  • 04-變數
    • 04.01-如何命名變數
    • 04.02-Scope(變數的作用範圍)
    • 04.03-常數(Constant)
    • 04.04-定義多個變數
    • 04.05-範例程式
    • 04.06-問題
  • 05-控制結構
    • 05.01-For
    • 05.02-If
    • 05.03-switch
    • 05.04-問題
  • 06-Array、Slice 與 Map
    • 06.01-陣列(Array)
    • 06.02-Slice
    • 06.03-Map
    • 06.04-問題
  • 07-函式
    • 07.01-你的第二個函式
    • 07.02-回傳多個值
    • 07.03-參數個數可變的函式(Variadic Function)
    • 07.04-Closure
    • 07.05-遞迴(Recursive)
    • 07.06-Defer, Panic & Recover
    • 07.07-Panic & Recover
    • 07.08-問題
  • 08-指標
    • 08.01-「*」與「&」運算符號
    • 08.02-new
    • 08.03-問題
  • 09-Struct 與 Interface
    • 09.01-struct
    • 09.02-Method
    • 09.03-Interface
    • 09.04-問題
  • 10-Concurrency(平行處理)
    • 10.01-Goroutine
    • 10.02-Channel
    • 10.03-問題
  • 11-Packages
    • 11.01-建立 Package
    • 11.02-文件
    • 11.03-問題
  • 12-測試
  • 13-The Core Packages
    • 13.01-字串
    • 13.02-輸入與輸出
    • 13.03-檔案與資料夾
    • 13.04-錯誤訊息
    • 13.05-Container 與 Sort
    • 13.06-雜湊&加解密
    • 13.07-伺服器
    • 13.08-解析命令列參數
    • 13.09-Synchronization Primitives(同步處理原始物件)
  • 14-下一步
    • 14.01-閱讀大師作品
    • 14.02-動手實作
    • 14.03-團隊合作
  • 15. 附錄-額外資源
Powered by GitBook
On this page
Edit on GitHub
  1. 09-Struct 與 Interface

09.03-Interface

你可能已經注意到,我們可以將 Rectangle 的 area method 命名為 Circle 的 area method。這並非意外。在真實世界設計程式時,像這類的相似關係,Go 語言提供了一種所謂的 Interface 型別,這裡有一個 Shape 介面的範例:

type Shape interface {
    area() float64
}

Interface 與 struct 一樣,都是使用 type 關鍵字建立的,後面跟著一個名稱,以及關鍵字 interface。不過這裡不定義欄位,而是定義一組 method,一組 method 指的是一串 methods,為了要實做 interface,所以這些 methods 都要有一個型別。

在我們的 Rectangle 與 Circle 範例中,都有 area method,而且會傳回 float64,所以這兩個型別都有實做 Shape interface。對它自己本身而言,這樣做並不會有什麼好處,不過我們可以使用 interface 型別做為函式的參數:

func totalArea(shapes ...Shape) float64 {
    var area float64
    for _, s := range shapes {
        area += s.area()
    }
    return area
}

我們會像這樣呼叫這個函式:

fmt.Println(totalArea(&c, &r))

也可以將 interface 做為欄位使用:

type MultiShape struct {
    shapes []Shape
}

我們甚至可以透過提供 MultiShape 一個 area method,將它自己轉為 Shape:

func (m *MultiShape) area() float64 {
    var area float64
    for _, s := range m.shapes {
        area += s.area()
    }
    return area
}

現在,一個 MultiShape 就包含了 Circle、Rectangle、或甚至是其它的 MultiShape。

Previous09.02-MethodNext09.04-問題

Last updated 2 years ago