Go | 初步了解介面是什麼?
💬 簡介
在 Go 語言中,介面(Interface)是一個核心的概念,提供了抽象化的方式來處理不同型別的物件,使得 Go 語言能夠實現多型、解耦合等特性。Go 的介面不僅讓我們能夠定義統一的行為,也能夠在程式中靈活地進行擴展與維護。
本文將介紹 Go 語言中的介面概念,並解釋為什麼我們需要介面。
圖片來源:Gophers
🔍 什麼是介面?
在 Go 語言中,介面是一組方法簽名的集合。當一個型別實現了介面中的所有方法後,這個型別就可以被視為實現了這個介面。Go 中的介面是隱式實現的,也就是說,型別不需要明確地聲明它實現了某個介面,只要它提供了介面中所要求的方法,Go 就會認為它自動實現了這個介面。
簡單來說,介面是一個描述某些行為的型別,它不關心型別的具體實現,只關心型別是否有實現所需的方法。
1️⃣ 為什麼需要介面?
介面在 Go 中主要有以下幾個用途:
- 實現多型:不同的型別可以通過實現相同的介面來執行相同的操作,這使得程式可以使用同一介面來處理不同型別的物件,達到多型的效果。
- 解耦:通過介面,我們可以將功能模組解耦,減少程式之間的相互依賴,讓系統更加靈活和可維護。
- 提高擴展性:當需要新增功能時,我們不需要修改現有程式碼,只需為新的型別實現相應的介面,這樣可以很容易地擴充系統功能。
2️⃣ 介面的語法結構
介面是用 type
關鍵字來定義的,並且在介面的名稱後會寫上該介面所包含的方法簽名。下面是介面的基本語法結構:
1 | type 介面名稱 interface { |
範例:
1 | type Speaker interface { |
📝 在上面的範例中,簡單的介面定義,它包含了一個
Speak
方法,這個方法接收一個string
型別的參數,並回傳一個string
型別的結果。
📌 各部分的說明
- 介面型別名:使用
type
將介面定義為自訂的型別名稱。在 Go 語言中,介面的命名習慣是以-er
結尾,表示這個介面有特定的行為。例如:- 有寫入操作的介面叫
Writer
- 有字串功能的介面叫
Stringer
- 有關閉功能的介面叫
Closer
這樣的命名習慣可以讓程式碼更具可讀性,讓開發者能夠根據介面的名稱理解它的功能。
- 有寫入操作的介面叫
- 方法名稱:當方法名稱的首字母是大寫時,且這個介面型別名稱的首字母也是大寫時,這個方法可以被介面所在的套件(package)以外的程式碼存取。反之,首字母為小寫時,該方法就只能在同一套件內使用。
- 參數清單、回傳值清單:介面方法的參數名稱和回傳值名稱是可以忽略的。方法的簽名只需要包含參數型別與回傳值型別。參數變數名稱不影響方法的簽名,例如:
1
2
3type Writer interface {
Write([]byte) error
}📝 在這個範例中,方法
Write
接收一個[]byte
型別的參數和一個error
型別的回傳值,參數名稱可以省略。
💡 介面的特點
- 隱式實作:Go 的介面沒有明確的「實作」關鍵字,型別只要實現了介面的方法,Go 就會認為它實現了這個介面。這樣的設計讓介面更加靈活。
- 沒有繼承:Go 語言不使用傳統物件導向中的繼承,而是通過介面的嵌入來實現類似的功能。例如,我們可以將一個介面嵌入到另一個介面中,從而讓一個型別實現多個介面。
- 多型:介面讓不同的型別可以統一通過相同的介面進行操作,這樣我們可以通過介面來處理不同型別的物件。
⚠️ 注意事項
- 隱式實現介面:
- Go 的介面是隱式實現的,不需要顯式地聲明型別實現了哪些介面。只要型別實現了介面中定義的所有方法,它就隱式實現了這個介面。
- 如果某個型別未實現介面中所需的所有方法,編譯器將報錯。
- 方法名稱的可見性:
- 方法名稱的首字母決定了它的可見性。如果方法名稱首字母大寫,則這個方法是公開的,可以被外部包(package)訪問。若首字母小寫,則該方法只能在定義它的包內部訪問。
- 方法簽名一致性:
- 在實現介面時,必須確保方法的簽名完全一致,包括方法名稱、參數型別、返回值型別等。即便參數名稱不同,只要型別一致,也視為一致。
🎯 總結
介面是 Go 語言中的一個非常重要的特性,它提供了一種靈活的抽象機制,讓我們能夠以統一的方式操作不同的型別,實現多型、解耦系統以及提高程式的可擴展性。Go 中的介面簡單、直觀,並且具有高度的靈活性和可維護性。
介面的隱式實作和簡潔設計使得 Go 的語法更加簡單且易於使用,這也是 Go 語言一個受開發者歡迎的特性。
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go