7 6 Go語言介面的巢狀組合

2021-10-06 19:57:20 字數 2157 閱讀 4657

在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 方法可以定義在乙個介面中,實現用同乙份啟動 實現不同服的初始化。這是...