在go語言中,不僅結構體與結構體之間可以巢狀,介面與介面間也可以通過巢狀創造出新的介面。
乙個介面可以包含乙個或多個其他的介面,這相當於直接將這些內嵌介面的方法列舉在外層介面中一樣。只要介面的所有方法被實現,則這個介面中的所有巢狀介面的方法均可以被呼叫。
系統包中的介面巢狀組合
go語言的 io 包中定義了寫入器(writer)、關閉器(closer)和寫入關閉器(writecloser)3 個介面,**如下:
type writer inte***ce
type closer inte***ce
type writecloser inte***ce
**說明如下:
第 1 行定義了寫入器(writer),如這個介面較為常用,常用於 i/o 裝置的資料寫入。
第 5 行定義了關閉器(closer),如有非託管記憶體資源的物件,需要用關閉的方法來實現資源釋放。
第 9 行定義了寫入關閉器(writecloser),這個介面由 writer 和 closer 兩個介面嵌入。也就是說,writecloser 同時擁有了 writer 和 closer 的特性。
在**中使用介面巢狀組合
在**中使用 io.writer、io.closer 和 io.writecloser 這 3 個介面時,只需要按照介面實現的規則實現 io.writer 介面和 io.closer 介面即可。而 io.writecloser 介面在使用時,編譯器會根據介面的實現者確認它們是否同時實現了 io.writer 和 io.closer 介面,詳細實現**如下:
package main
import
("io"
)// 宣告乙個裝置結構
type device struct
// 實現io.writer的write()方法
func
(d *device)
write
(p [
]byte
)(n int
, err error
)// 實現io.closer的close()方法
func
(d *device)
close()
error
func
main()
**說明如下:
第 8 行定義了 device 結構體,用來模擬乙個虛擬裝置,這個結構會實現前面提到的 3 種介面。
第 12 行,實現了 io.writer 的 write() 方法。
第 17 行,實現了 io.closer 的 close() 方法。
第 24 行,對 device 例項化,由於 device 實現了 io.writecloser 的所有嵌入介面,因此 device 指標就會被隱式轉換為 io.writecloser 介面。
第 27 行,呼叫了 wc(io.writecloser介面)的 write() 方法,由於 wc 被賦值 *device,因此最終會呼叫 device 的 write() 方法。
第 30 行,與 27 行類似,最終呼叫 device 的 close() 方法。
第 33 行,再次建立乙個 device 的例項,writeonly 是乙個 io.writer 介面,這個介面只有 write() 方法。
第 36 行,writeonly 只能呼叫 write() 方法,沒有 close() 方法。
為了整理思路,將上面的實現、呼叫關係使用圖方式來展現,參見圖 1 和圖 2。
1) io.writecloser的實現及呼叫過程如圖 1 所示。
圖1:io.writecloser 的實現及呼叫過程
2) io.writer 的實現呼叫過程如圖 2 所示。
圖2:io.write 的實現及呼叫過程
給 io.writecloser 或 io.writer 更換不同的實現者,可以動態地切換實現**。
1 28 Go之介面的巢狀組合
系統包中的介面巢狀組合 type writer inte ce type closer inte ce 定義了寫入關閉器 writecloser 這個介面由 writer 和 closer 兩個介面嵌入。同時擁有了 writer 和 closer 的特性 type writecloser inte ...
go語言 介面的思考(一)
在 學習go語言 中,有乙個例子,說得是怎樣做乙個通用的介面來實現給數字,字串來排序。第一種思路 1.定義乙個函式,可以接收任意型別做為入參,然後 在函式內,根據入參來判斷是那乙個型別 func sort i inte ce 在呼叫時,sort int 我們傳入了乙個陣列,很不幸,go不能 隱式 轉...
Go語言 通俗理解介面的概念
更新 根據實際開發理解介面 給乙個服務端的場景吧 有不同的伺服器組成的後端,登入註冊服,gateway服,處理邏輯的伺服器,他們都需要在鏈結前啟動,向乙個統一的伺服器發現的伺服器註冊自己 以便宕機改變訊息的 路徑 那麼他們的run 方法可以定義在乙個介面中,實現用同乙份啟動 實現不同服的初始化。這是...