中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中類型與接口的關系是什么

發布時間:2023-01-09 10:33:14 來源:億速云 閱讀:117 作者:iii 欄目:編程語言

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

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

Go語言類型與接口的關系

在Go語言中類型和接口之間有一對多和多對一的關系,下面將列舉出這些常見的概念,以方便讀者理解接口與類型在復雜環境下的實現關系。

一個類型可以實現多個接口

一個類型可以同時實現多個接口,而接口間彼此獨立,不知道對方的實現。

網絡上的兩個程序通過一個雙向的通信連接實現數據的交換,連接的一端稱為一個 Socket。Socket 能夠同時讀取和寫入數據,這個特性與文件類似。因此,開發中把文件和 Socket 都具備的讀寫特性抽象為獨立的讀寫器概念。

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

把 Socket 能夠寫入數據和需要關閉的特性使用接口來描述,請參考下面的代碼:

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

Socket 結構的 Write() 方法實現了 io.Writer 接口:

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

同時,Socket 結構也實現了 io.Closer 接口:

type Closer interface {
    Close() error
}

使用 Socket 實現的 Writer 接口的代碼,無須了解 Writer 接口的實現者是否具備 Closer 接口的特性。同樣,使用 Closer 接口的代碼也并不知道 Socket 已經實現了 Writer 接口,如下圖所示。

Go語言中類型與接口的關系是什么
圖:接口的使用和實現過程

在代碼中使用 Socket 結構實現的 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() {
    // 實例化Socket
    s := new(Socket)
    usingWriter(s)
    usingCloser(s)
}

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

多個類型可以實現相同的接口

一個接口的方法,不一定需要由一個類型完全實現,接口的方法可以通過在類型中嵌入其他類型或者結構體來實現。也就是說,使用者并不關心某個接口的方法是通過一個類型完全實現的,還是通過多個結構嵌入到一個結構體中拼湊起來共同實現的。

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

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

代碼說明如下:

  • 第 2 行,定義服務接口,一個服務需要實現 Start() 方法和日志方法。

  • 第 8 行,定義能輸出日志的日志器結構。

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

  • 第 17 行,定義 GameService 結構。

  • 第 18 行,在 GameService 中嵌入 Logger 日志器,以實現日志功能。

  • 第 22 行,GameService 的 Start() 方法實現了 Service 的 Start() 方法。

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

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

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

以上就是“Go語言中類型與接口的關系是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜川县| 略阳县| 海晏县| 海淀区| 紫阳县| 陇西县| 东阿县| 巩义市| 盐山县| 福海县| 社旗县| 肥西县| 临泽县| 永新县| 尖扎县| 肇州县| 冕宁县| 贡山| 麻城市| 岑溪市| 五寨县| 定远县| 宣威市| 曲阳县| 西乌珠穆沁旗| 贵南县| 涿鹿县| 南皮县| 桃园县| 绥江县| 渝中区| 观塘区| 清远市| 邢台市| 泽普县| 临桂县| 武川县| 上林县| 容城县| 林州市| 迭部县|