Go語(yǔ)言接口的嵌套的具體使用
在Go語(yǔ)言中,不僅結(jié)構(gòu)體與結(jié)構(gòu)體之間可以嵌套,接口與接口間也可以通過(guò)嵌套創(chuàng)造出新的接口。
一個(gè)接口可以包含一個(gè)或多個(gè)其他的接口,這相當(dāng)于直接將這些內(nèi)嵌接口的方法列舉在外層接口中一樣。只要接口的所有方法被實(shí)現(xiàn),則這個(gè)接口中的所有嵌套接口的方法均可以被調(diào)用。
系統(tǒng)包中的接口嵌套組合
Go語(yǔ)言的 io 包中定義了寫(xiě)入器(Writer)、關(guān)閉器(Closer)和寫(xiě)入關(guān)閉器(WriteCloser)3 個(gè)接口,代碼如下:
type Writer interface {
Write(p []byte) (n int, err error)
}
type Closer interface {
Close() error
}
type WriteCloser interface {
Writer
Closer
}
代碼說(shuō)明如下:
- 第 1 行定義了寫(xiě)入器(Writer),如這個(gè)接口較為常用,常用于 I/O 設(shè)備的數(shù)據(jù)寫(xiě)入。
- 第 5 行定義了關(guān)閉器(Closer),如有非托管內(nèi)存資源的對(duì)象,需要用關(guān)閉的方法來(lái)實(shí)現(xiàn)資源釋放。
- 第 9 行定義了寫(xiě)入關(guān)閉器(WriteCloser),這個(gè)接口由 Writer 和 Closer 兩個(gè)接口嵌入。也就是說(shuō),WriteCloser 同時(shí)擁有了 Writer 和 Closer 的特性。
在代碼中使用接口嵌套組合
在代碼中使用 io.Writer、io.Closer 和 io.WriteCloser 這 3 個(gè)接口時(shí),只需要按照接口實(shí)現(xiàn)的規(guī)則實(shí)現(xiàn) io.Writer 接口和 io.Closer 接口即可。而 io.WriteCloser 接口在使用時(shí),編譯器會(huì)根據(jù)接口的實(shí)現(xiàn)者確認(rèn)它們是否同時(shí)實(shí)現(xiàn)了 io.Writer 和 io.Closer 接口,詳細(xì)實(shí)現(xiàn)代碼如下:
package main
import (
"io"
)
// 聲明一個(gè)設(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() {
// 聲明寫(xiě)入關(guān)閉器, 并賦予device的實(shí)例
var wc io.WriteCloser = new(device)
// 寫(xiě)入數(shù)據(jù)
wc.Write(nil)
// 關(guān)閉設(shè)備
wc.Close()
// 聲明寫(xiě)入器, 并賦予device的新實(shí)例
var writeOnly io.Writer = new(device)
// 寫(xiě)入數(shù)據(jù)
writeOnly.Write(nil)
}
代碼說(shuō)明如下:
- 第 8 行定義了 device 結(jié)構(gòu)體,用來(lái)模擬一個(gè)虛擬設(shè)備,這個(gè)結(jié)構(gòu)會(huì)實(shí)現(xiàn)前面提到的 3 種接口。
- 第 12 行,實(shí)現(xiàn)了 io.Writer 的 Write() 方法。
- 第 17 行,實(shí)現(xiàn)了 io.Closer 的 Close() 方法。
- 第 24 行,對(duì) device 實(shí)例化,由于 device 實(shí)現(xiàn)了 io.WriteCloser 的所有嵌入接口,因此 device 指針就會(huì)被隱式轉(zhuǎn)換為 io.WriteCloser 接口。
- 第 27 行,調(diào)用了 wc(io.WriteCloser接口)的 Write() 方法,由于 wc 被賦值 *device,因此最終會(huì)調(diào)用 device 的 Write() 方法。
- 第 30 行,與 27 行類似,最終調(diào)用 device 的 Close() 方法。
- 第 33 行,再次創(chuàng)建一個(gè) device 的實(shí)例,writeOnly 是一個(gè) io.Writer 接口,這個(gè)接口只有 Write() 方法。
- 第 36 行,writeOnly 只能調(diào)用 Write() 方法,沒(méi)有 Close() 方法。
為了整理思路,將上面的實(shí)現(xiàn)、調(diào)用關(guān)系使用圖方式來(lái)展現(xiàn),參見(jiàn)圖 1 和圖 2。
1) io.WriteCloser的實(shí)現(xiàn)及調(diào)用過(guò)程如圖 1 所示。

圖1:io.WriteCloser 的實(shí)現(xiàn)及調(diào)用過(guò)程
2) io.Writer 的實(shí)現(xiàn)調(diào)用過(guò)程如圖 2 所示。

圖2:io.Write 的實(shí)現(xiàn)及調(diào)用過(guò)程
給 io.WriteCloser 或 io.Writer 更換不同的實(shí)現(xiàn)者,可以動(dòng)態(tài)地切換實(shí)現(xiàn)代碼。
到此這篇關(guān)于Go語(yǔ)言接口的嵌套的具體使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言接口嵌套內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go設(shè)計(jì)模式之訪問(wèn)者模式講解和代碼示例
訪問(wèn)者是一種行為設(shè)計(jì)模式, 允許你在不修改已有代碼的情況下向已有類層次結(jié)構(gòu)中增加新的行為,本文將通過(guò)代碼示例給大家詳細(xì)的介紹一下Go設(shè)計(jì)模式之訪問(wèn)者模式,需要的朋友可以參考下2023-08-08
golang使用aes庫(kù)實(shí)現(xiàn)加解密操作
這篇文章主要介紹了golang使用aes庫(kù)實(shí)現(xiàn)加解密操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
grpcurl通過(guò)命令行訪問(wèn)gRPC服務(wù)
這篇文章主要為大家介紹了grpcurl通過(guò)命令行訪問(wèn)gRPC服務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Golang實(shí)現(xiàn)自己的Redis(有序集合跳表)實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)自己的Redis(有序集合跳表)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
go-zero接入skywalking實(shí)現(xiàn)鏈路追蹤的詳細(xì)教程
SkyWalking是一個(gè)開(kāi)源的服務(wù)追蹤系統(tǒng),它專注于分布式系統(tǒng)的可觀測(cè)性和服務(wù)性能分析,它的主要目標(biāo)是幫助開(kāi)發(fā)者理解和優(yōu)化微服務(wù)架構(gòu)中的服務(wù)間交互情況,本文介紹了go-zero接入skywalking鏈路追蹤的詳細(xì)教程,需要的朋友可以參考下2024-08-08
這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎
這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Go語(yǔ)言時(shí)需要了解的interface{}注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-03
Go語(yǔ)言中常量和變量的定義、使用規(guī)范及常見(jiàn)應(yīng)用場(chǎng)景
每一門(mén)語(yǔ)言都會(huì)有常量的定義,變量的定義,以及基于這些定義的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中常量和變量的定義、使用規(guī)范及常見(jiàn)應(yīng)用場(chǎng)景的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06

