1. 程式人生 > >Go語言規格說明書 之 接口類型(Interface types)

Go語言規格說明書 之 接口類型(Interface types)

simple 補充 功能 strong pack 唯一性 using 循環嵌套 write

go version go1.11 windows/amd64

本文為閱讀Go語言中文官網的規則說明書(https://golang.google.cn/ref/spec)而做的筆記,介紹Go語言的 接口類型(Interface types)

接口類型應該是從軟件設計上考慮才接入的類型,它本身不實現任何功能,但會 聲明 一些功能。

在Go語言中,任何 實現 了接口類型中 聲明 的功能的類型,都可以成為 實現了 某接口

比如,聲明一個 汽車接口,裏面包含若幹方法,任何實現了這個 汽車接口 的的類型 都可以被稱為 汽車,不過,有些是 汽油柴油動力汽車,有些是電動汽車。

而且,一個類型可以實現多個接口,只要這個類型的 方法集 包含 某個 接口類型 所聲明的文件,就可以稱 這個類型實現了這個接口。

上面是閱讀了官文後自己對 接口類型 和 其它類型、方法集 等概念的理解,下面是補充,涵蓋怎麽使用接口類型的的信息。

接口類型 中聲明的方法 即使 接口類型的 方法集——不只是普通類型有方法集,接口類型也有。

可以用接口類型聲明變量,未初始化的接口類型變量為 nil。

接口類型變量 可以存儲 任何方法集涵蓋了接口類型方法集 的類型 的值。

接口類型變量怎麽初始化呢?new函數!下面是來自RUNOOB.COM的示例代碼:

技術分享圖片
package main

import (
    "fmt"
)

type Phone interface {
    call()
}

type NokiaPhone struct {
}

func (nokiaPhone NokiaPhone) call() {
    fmt.Println("I am Nokia, I can call you!")
}

type IPhone struct {
}

func (iPhone IPhone) call() {
    fmt.Println("I am iPhone, I can call you!")
}

func main() {
    var phone Phone

    phone = new(NokiaPhone)
    phone.call()

    phone = new(IPhone)
    phone.call()

}
runoob_iface_eg.go

接口類型 的方法集 的名稱必須是 非空 且 唯一 的(a unique non-blank name)——和前文將的結構體類型不一樣,結構體類型有空域。

牢記:

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

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

空接口:

任何類型都實現了 空接口。

空接口 不是 nil。

interface{}

最後,接口類型嵌套——在 接口類型 定義中,直接使用 另一個接口類型的名稱,這樣,另一個接口類型的方法就被 嵌套到 新的接口類型中了。

註意,被嵌入接口類型 的方法集中的方法 和 新接口類型中定義的方法名稱 不能沖突,保持 唯一性。

註意,接口類型不能 以任何形式嵌入其自身。

其實,接口類型在之前的一篇博文中介紹過,不過,那時是理解不深刻,寫了這樣單獨的一篇博文,對接口類型了解的更清楚了。當然,還需要更多的運用、實踐才行。

官文示例及俺的解讀:

// A simple File interface
interface {
	Read(b Buffer) bool
	Write(b Buffer) bool
	Close()
}

// 需要查看 類型的方法定義 文檔,下面的類型T實現了上面的接口
func (p T) Read(b Buffer) bool { return … }
func (p T) Write(b Buffer) bool { return … }
func (p T) Close() { … }

// type 類型定義語句
// 和結構體一樣,只有使用type語句給接口類型定義了一個標識符了,接口類型才可以很好地使用
// 當然,不排除匿名接口類型的使用,一般為一次性的
// 定義接口類型後,直接 聲明 變量?
type Locker interface {
	Lock()
	Unlock()
}

type ReadWriter interface {
	Read(b Buffer) bool
	Write(b Buffer) bool
}

// 嵌入類型
type File interface {
	ReadWriter  // same as adding the methods of ReadWriter
	Locker      // same as adding the methods of Locker
	Close()
}

// 嵌入的類型導致方法名稱沖突
type LockedFile interface {
	Locker
	File        // illegal: Lock, Unlock not unique
	Lock()      // illegal: Lock not unique
}

// 不能嵌套自身——循環嵌套
// illegal: Bad cannot embed itself
type Bad interface {
	Bad
}

// illegal: Bad1 cannot embed itself using Bad2
type Bad1 interface {
	Bad2
}
type Bad2 interface {
	Bad1
}

參考鏈接:

1.Go 語言接口

Go語言規格說明書 之 接口類型(Interface types)