Like Share Discussion Bookmark Smile

J.J. Huang   2025-03-26   Getting Started Golang 06.介面   瀏覽次數:次   DMCA.com Protection Status

Go | 初步了解介面是什麼?

💬 簡介

在 Go 語言中,介面(Interface)是一個核心的概念,提供了抽象化的方式來處理不同型別的物件,使得 Go 語言能夠實現多型、解耦合等特性。Go 的介面不僅讓我們能夠定義統一的行為,也能夠在程式中靈活地進行擴展與維護。

本文將介紹 Go 語言中的介面概念,並解釋為什麼我們需要介面。

圖片來源:Gophers


🔍 什麼是介面?

在 Go 語言中,介面是一組方法簽名的集合。當一個型別實現了介面中的所有方法後,這個型別就可以被視為實現了這個介面。Go 中的介面是隱式實現的,也就是說,型別不需要明確地聲明它實現了某個介面,只要它提供了介面中所要求的方法,Go 就會認為它自動實現了這個介面。

簡單來說,介面是一個描述某些行為的型別,它不關心型別的具體實現,只關心型別是否有實現所需的方法。

1️⃣ 為什麼需要介面?

介面在 Go 中主要有以下幾個用途:

  • 實現多型:不同的型別可以通過實現相同的介面來執行相同的操作,這使得程式可以使用同一介面來處理不同型別的物件,達到多型的效果。
  • 解耦:通過介面,我們可以將功能模組解耦,減少程式之間的相互依賴,讓系統更加靈活和可維護。
  • 提高擴展性:當需要新增功能時,我們不需要修改現有程式碼,只需為新的型別實現相應的介面,這樣可以很容易地擴充系統功能。

2️⃣ 介面的語法結構

介面是用 type 關鍵字來定義的,並且在介面的名稱後會寫上該介面所包含的方法簽名。下面是介面的基本語法結構:

1
2
3
type 介面名稱 interface {
方法名稱(參數型別) 回傳值型別
}

範例:

1
2
3
type Speaker interface {
Speak() string
}

📝 在上面的範例中,簡單的介面定義,它包含了一個 Speak 方法,這個方法接收一個 string 型別的參數,並回傳一個 string 型別的結果。

📌 各部分的說明

  • 介面型別名:使用 type 將介面定義為自訂的型別名稱。在 Go 語言中,介面的命名習慣是以 -er 結尾,表示這個介面有特定的行為。例如:
    • 有寫入操作的介面叫 Writer
    • 有字串功能的介面叫 Stringer
    • 有關閉功能的介面叫 Closer
      這樣的命名習慣可以讓程式碼更具可讀性,讓開發者能夠根據介面的名稱理解它的功能。
  • 方法名稱:當方法名稱的首字母是大寫時,且這個介面型別名稱的首字母也是大寫時,這個方法可以被介面所在的套件(package)以外的程式碼存取。反之,首字母為小寫時,該方法就只能在同一套件內使用。
  • 參數清單、回傳值清單:介面方法的參數名稱和回傳值名稱是可以忽略的。方法的簽名只需要包含參數型別與回傳值型別。參數變數名稱不影響方法的簽名,例如:
    1
    2
    3
    type Writer interface {
    Write([]byte) error
    }

    📝 在這個範例中,方法 Write 接收一個 []byte 型別的參數和一個 error 型別的回傳值,參數名稱可以省略。


💡 介面的特點

  • 隱式實作:Go 的介面沒有明確的「實作」關鍵字,型別只要實現了介面的方法,Go 就會認為它實現了這個介面。這樣的設計讓介面更加靈活。
  • 沒有繼承:Go 語言不使用傳統物件導向中的繼承,而是通過介面的嵌入來實現類似的功能。例如,我們可以將一個介面嵌入到另一個介面中,從而讓一個型別實現多個介面。
  • 多型:介面讓不同的型別可以統一通過相同的介面進行操作,這樣我們可以通過介面來處理不同型別的物件。

⚠️ 注意事項

  • 隱式實現介面
    • Go 的介面是隱式實現的,不需要顯式地聲明型別實現了哪些介面。只要型別實現了介面中定義的所有方法,它就隱式實現了這個介面。
    • 如果某個型別未實現介面中所需的所有方法,編譯器將報錯。
  • 方法名稱的可見性
    • 方法名稱的首字母決定了它的可見性。如果方法名稱首字母大寫,則這個方法是公開的,可以被外部包(package)訪問。若首字母小寫,則該方法只能在定義它的包內部訪問。
  • 方法簽名一致性
    • 在實現介面時,必須確保方法的簽名完全一致,包括方法名稱、參數型別、返回值型別等。即便參數名稱不同,只要型別一致,也視為一致。

🎯 總結

介面是 Go 語言中的一個非常重要的特性,它提供了一種靈活的抽象機制,讓我們能夠以統一的方式操作不同的型別,實現多型、解耦系統以及提高程式的可擴展性。Go 中的介面簡單、直觀,並且具有高度的靈活性和可維護性。

介面的隱式實作和簡潔設計使得 Go 的語法更加簡單且易於使用,這也是 Go 語言一個受開發者歡迎的特性。

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go