Go語言中類型與接口的關(guān)系是什么

今天小編給大家分享一下Go語言中類型與接口的關(guān)系是什么的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站制作與策劃設(shè)計(jì),宣化網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:宣化等地區(qū)。宣化做網(wǎng)站價(jià)格咨詢:028-86922220

在Go語言中,類型和接口之間有一對多和多對一的關(guān)系。一個類型可以同時(shí)實(shí)現(xiàn)多個接口,而接口間彼此獨(dú)立,不知道對方的實(shí)現(xiàn)。多個類型也可以實(shí)現(xiàn)相同的接口:一個接口的方法,不一定需要由一個類型完全實(shí)現(xiàn),接口的方法可以通過在類型中嵌入其他類型或者結(jié)構(gòu)體來實(shí)現(xiàn)。也就是說,使用者并不關(guān)心某個接口的方法是通過一個類型完全實(shí)現(xiàn)的,還是通過多個結(jié)構(gòu)嵌入到一個結(jié)構(gòu)體中拼湊起來共同實(shí)現(xiàn)的。

Go語言類型與接口的關(guān)系

在Go語言中類型和接口之間有一對多和多對一的關(guān)系,下面將列舉出這些常見的概念,以方便讀者理解接口與類型在復(fù)雜環(huán)境下的實(shí)現(xiàn)關(guān)系。

一個類型可以實(shí)現(xiàn)多個接口

一個類型可以同時(shí)實(shí)現(xiàn)多個接口,而接口間彼此獨(dú)立,不知道對方的實(shí)現(xiàn)。

網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,連接的一端稱為一個 Socket。Socket 能夠同時(shí)讀取和寫入數(shù)據(jù),這個特性與文件類似。因此,開發(fā)中把文件和 Socket 都具備的讀寫特性抽象為獨(dú)立的讀寫器概念。

Socket 和文件一樣,在使用完畢后,也需要對資源進(jìn)行釋放。

把 Socket 能夠?qū)懭霐?shù)據(jù)和需要關(guān)閉的特性使用接口來描述,請參考下面的代碼:

type Socket struct {
}
func (s *Socket) Write(p []byte) (n int, err error) {
    return 0, nil
}
func (s *Socket) Close() error {
    return nil
}

Socket 結(jié)構(gòu)的 Write() 方法實(shí)現(xiàn)了 io.Writer 接口:

type Writer interface {
    Write(p []byte) (n int, err error)
}

同時(shí),Socket 結(jié)構(gòu)也實(shí)現(xiàn)了 io.Closer 接口:

type Closer interface {
    Close() error
}

使用 Socket 實(shí)現(xiàn)的 Writer 接口的代碼,無須了解 Writer 接口的實(shí)現(xiàn)者是否具備 Closer 接口的特性。同樣,使用 Closer 接口的代碼也并不知道 Socket 已經(jīng)實(shí)現(xiàn)了 Writer 接口,如下圖所示。

Go語言中類型與接口的關(guān)系是什么
圖:接口的使用和實(shí)現(xiàn)過程

在代碼中使用 Socket 結(jié)構(gòu)實(shí)現(xiàn)的 Writer 接口和 Closer 接口代碼如下:

// 使用io.Writer的代碼, 并不知道Socket和io.Closer的存在
func usingWriter( writer io.Writer){
    writer.Write( nil )
}
// 使用io.Closer, 并不知道Socket和io.Writer的存在
func usingCloser( closer io.Closer) {
    closer.Close()
}
func main() {
    // 實(shí)例化Socket
    s := new(Socket)
    usingWriter(s)
    usingCloser(s)
}

usingWriter() 和 usingCloser() 完全獨(dú)立,互相不知道對方的存在,也不知道自己使用的接口是 Socket 實(shí)現(xiàn)的。

多個類型可以實(shí)現(xiàn)相同的接口

一個接口的方法,不一定需要由一個類型完全實(shí)現(xiàn),接口的方法可以通過在類型中嵌入其他類型或者結(jié)構(gòu)體來實(shí)現(xiàn)。也就是說,使用者并不關(guān)心某個接口的方法是通過一個類型完全實(shí)現(xiàn)的,還是通過多個結(jié)構(gòu)嵌入到一個結(jié)構(gòu)體中拼湊起來共同實(shí)現(xiàn)的。

Service 接口定義了兩個方法:一個是開啟服務(wù)的方法(Start()),一個是輸出日志的方法(Log())。使用 GameService 結(jié)構(gòu)體來實(shí)現(xiàn) Service,GameService 自己的結(jié)構(gòu)只能實(shí)現(xiàn) Start() 方法,而 Service 接口中的 Log() 方法已經(jīng)被一個能輸出日志的日志器(Logger)實(shí)現(xiàn)了,無須再進(jìn)行 GameService 封裝,或者重新實(shí)現(xiàn)一遍。所以,選擇將 Logger 嵌入到 GameService 能最大程度地避免代碼冗余,簡化代碼結(jié)構(gòu)。詳細(xì)實(shí)現(xiàn)過程如下:

// 一個服務(wù)需要滿足能夠開啟和寫日志的功能
type Service interface {
    Start()  // 開啟服務(wù)
    Log(string)  // 日志輸出
}
// 日志器
type Logger struct {
}
// 實(shí)現(xiàn)Service的Log()方法
func (g *Logger) Log(l string) {
}
// 游戲服務(wù)
type GameService struct {
    Logger  // 嵌入日志器
}
// 實(shí)現(xiàn)Service的Start()方法
func (g *GameService) Start() {
}

代碼說明如下:

  • 第 2 行,定義服務(wù)接口,一個服務(wù)需要實(shí)現(xiàn) Start() 方法和日志方法。

  • 第 8 行,定義能輸出日志的日志器結(jié)構(gòu)。

  • 第 12 行,為 Logger 添加 Log() 方法,同時(shí)實(shí)現(xiàn) Service 的 Log() 方法。

  • 第 17 行,定義 GameService 結(jié)構(gòu)。

  • 第 18 行,在 GameService 中嵌入 Logger 日志器,以實(shí)現(xiàn)日志功能。

  • 第 22 行,GameService 的 Start() 方法實(shí)現(xiàn)了 Service 的 Start() 方法。

此時(shí),實(shí)例化 GameService,并將實(shí)例賦給 Service,代碼如下:

var s Service = new(GameService)
s.Start()
s.Log(“hello”)

s 就可以使用 Start() 方法和 Log() 方法,其中,Start() 由 GameService 實(shí)現(xiàn),Log() 方法由 Logger 實(shí)現(xiàn)。

以上就是“Go語言中類型與接口的關(guān)系是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁題目:Go語言中類型與接口的關(guān)系是什么
文章位置:http://m.kartarina.com/article20/pipico.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站網(wǎng)站制作面包屑導(dǎo)航用戶體驗(yàn)搜索引擎優(yōu)化標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
主站蜘蛛池模板: 国产丝袜无码一区二区视频| 一本之道高清无码视频| 亚洲国产精品无码久久久不卡| 亚洲一区AV无码少妇电影☆| 日韩免费无码一区二区三区| 国产福利无码一区在线| 亚洲av无码不卡一区二区三区 | 无码av高潮喷水无码专区线| 少妇爆乳无码专区| 无码人妻精品一区二区在线视频| 无码欧精品亚洲日韩一区夜夜嗨| 精品无码成人片一区二区98| 永久免费av无码网站yy| 人妻无码久久中文字幕专区| 中文无码亚洲精品字幕| 国产成人亚洲综合无码精品 | 精品三级AV无码一区| 无码人妻AⅤ一区二区三区水密桃| 亚洲视频无码高清在线| 亚洲不卡中文字幕无码| 久久99久久无码毛片一区二区| 亚洲精品久久无码av片俺去也| 日韩国产成人无码av毛片| 国产成年无码久久久免费| 亚洲不卡无码av中文字幕| 亚洲av成人无码网站…| 亚洲AV成人片无码网站| 亚洲欧洲AV无码专区| 人妻少妇看A偷人无码电影| 日韩一区二区三区无码影院| 国99精品无码一区二区三区| 亚洲成AV人在线观看天堂无码| 国产精品无码无片在线观看| 亚洲欧洲日产国码无码网站| 亚洲熟妇无码乱子AV电影| 亚洲中文字幕无码不卡电影| 国产精品无码av在线播放| 亚洲AV无码一区东京热| 精品无码人妻一区二区三区品| 久久无码AV一区二区三区| 亚洲中文无码永久免|