Go語言接口的嵌套的具體使用
在Go語言中,不僅結(jié)構(gòu)體與結(jié)構(gòu)體之間可以嵌套,接口與接口間也可以通過嵌套創(chuàng)造出新的接口。
一個接口可以包含一個或多個其他的接口,這相當(dāng)于直接將這些內(nèi)嵌接口的方法列舉在外層接口中一樣。只要接口的所有方法被實(shí)現(xiàn),則這個接口中的所有嵌套接口的方法均可以被調(diào)用。
系統(tǒng)包中的接口嵌套組合
Go語言的 io 包中定義了寫入器(Writer)、關(guān)閉器(Closer)和寫入關(guān)閉器(WriteCloser)3 個接口,代碼如下:
type Writer interface { Write(p []byte) (n int, err error) } type Closer interface { Close() error } type WriteCloser interface { Writer Closer }
代碼說明如下:
- 第 1 行定義了寫入器(Writer),如這個接口較為常用,常用于 I/O 設(shè)備的數(shù)據(jù)寫入。
- 第 5 行定義了關(guān)閉器(Closer),如有非托管內(nèi)存資源的對象,需要用關(guān)閉的方法來實(shí)現(xiàn)資源釋放。
- 第 9 行定義了寫入關(guān)閉器(WriteCloser),這個接口由 Writer 和 Closer 兩個接口嵌入。也就是說,WriteCloser 同時(shí)擁有了 Writer 和 Closer 的特性。
在代碼中使用接口嵌套組合
在代碼中使用 io.Writer、io.Closer 和 io.WriteCloser 這 3 個接口時(shí),只需要按照接口實(shí)現(xiàn)的規(guī)則實(shí)現(xiàn) io.Writer 接口和 io.Closer 接口即可。而 io.WriteCloser 接口在使用時(shí),編譯器會根據(jù)接口的實(shí)現(xiàn)者確認(rèn)它們是否同時(shí)實(shí)現(xiàn)了 io.Writer 和 io.Closer 接口,詳細(xì)實(shí)現(xiàn)代碼如下:
package main import ( "io" ) // 聲明一個設(shè)備結(jié)構(gòu) type device struct { } // 實(shí)現(xiàn)io.Writer的Write()方法 func (d *device) Write(p []byte) (n int, err error) { return 0, nil } // 實(shí)現(xiàn)io.Closer的Close()方法 func (d *device) Close() error { return nil } func main() { // 聲明寫入關(guān)閉器, 并賦予device的實(shí)例 var wc io.WriteCloser = new(device) // 寫入數(shù)據(jù) wc.Write(nil) // 關(guān)閉設(shè)備 wc.Close() // 聲明寫入器, 并賦予device的新實(shí)例 var writeOnly io.Writer = new(device) // 寫入數(shù)據(jù) writeOnly.Write(nil) }
代碼說明如下:
- 第 8 行定義了 device 結(jié)構(gòu)體,用來模擬一個虛擬設(shè)備,這個結(jié)構(gòu)會實(shí)現(xiàn)前面提到的 3 種接口。
- 第 12 行,實(shí)現(xiàn)了 io.Writer 的 Write() 方法。
- 第 17 行,實(shí)現(xiàn)了 io.Closer 的 Close() 方法。
- 第 24 行,對 device 實(shí)例化,由于 device 實(shí)現(xiàn)了 io.WriteCloser 的所有嵌入接口,因此 device 指針就會被隱式轉(zhuǎn)換為 io.WriteCloser 接口。
- 第 27 行,調(diào)用了 wc(io.WriteCloser接口)的 Write() 方法,由于 wc 被賦值 *device,因此最終會調(diào)用 device 的 Write() 方法。
- 第 30 行,與 27 行類似,最終調(diào)用 device 的 Close() 方法。
- 第 33 行,再次創(chuàng)建一個 device 的實(shí)例,writeOnly 是一個 io.Writer 接口,這個接口只有 Write() 方法。
- 第 36 行,writeOnly 只能調(diào)用 Write() 方法,沒有 Close() 方法。
為了整理思路,將上面的實(shí)現(xiàn)、調(diào)用關(guān)系使用圖方式來展現(xiàn),參見圖 1 和圖 2。
1) io.WriteCloser的實(shí)現(xiàn)及調(diào)用過程如圖 1 所示。
圖1:io.WriteCloser 的實(shí)現(xiàn)及調(diào)用過程
2) io.Writer 的實(shí)現(xiàn)調(diào)用過程如圖 2 所示。
圖2:io.Write 的實(shí)現(xiàn)及調(diào)用過程
給 io.WriteCloser 或 io.Writer 更換不同的實(shí)現(xiàn)者,可以動態(tài)地切換實(shí)現(xiàn)代碼。
到此這篇關(guān)于Go語言接口的嵌套的具體使用的文章就介紹到這了,更多相關(guān)Go語言接口嵌套內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
goland?-sync/atomic原子操作小結(jié)
這篇文章主要介紹了goland?-sync/atomic原子操作,原子操作能夠保證執(zhí)行期間是連續(xù)且不會被中斷(變量不會被其他修改,mutex可能存在被其他修改的情況),本文給大家介紹的非常詳細(xì),需要的朋友參考下2022-08-08golang利用redis和gin實(shí)現(xiàn)保存登錄狀態(tài)校驗(yàn)登錄功能
這篇文章主要介紹了golang利用redis和gin實(shí)現(xiàn)保存登錄狀態(tài)校驗(yàn)登錄功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01