golang 切片 接口_如何理解Golang中的接口?
個人認(rèn)為,要理解 Go 的接口,一定先了解下鴨子模型。
鴨子模型
那什么鴨子模型?
鴨子模型的解釋,通常會用了一個非常有趣的例子,一個東西究竟是不是鴨子,取決于它的能力。游泳起來像鴨子、叫起來也像鴨子,那么就可以是鴨子。
動態(tài)語言,比如 Python 和 Javascript 天然支持這種特性,不過相對于靜態(tài)語言,動態(tài)語言的類型缺乏了必要的類型檢查。
Go 接口設(shè)計和鴨子模型有密切關(guān)系,但又和動態(tài)語言的鴨子模型有所區(qū)別,在編譯時,即可實(shí)現(xiàn)必要的類型檢查。
什么是 Go 接口
Go 接口是一組方法的集合,可以理解為抽象的類型。它提供了一種非侵入式的接口。任何類型,只要實(shí)現(xiàn)了該接口中方法集,那么就屬于這個類型。
舉個例子,假設(shè)定義一個鴨子的接口。如下:
type Duck interface {
Quack() // 鴨子叫 DuckGo() // 鴨子走}
假設(shè)現(xiàn)在有一個雞類型,結(jié)構(gòu)如下:
type Chicken struct {
}
func (c Chicken) IsChicken() bool {
fmt.Println("我是小雞")
}
這只雞和一般的小雞不一樣,它比較聰明,也可以做鴨子能做的事情。
func (c Chicken) Quack() {
fmt.Println("嘎嘎")
}
func (c Chicken) DuckGo() {
fmt.Println("大搖大擺的走")
}
注意,這里只是實(shí)現(xiàn)了 Duck 接口方法,并沒有將雞類型和鴨子接口顯式綁定。這是一種非侵入式的設(shè)計。
我們定義一個函數(shù),負(fù)責(zé)執(zhí)行鴨子能做的事情。
func DoDuck(d Duck) {
d.Quack()
d.DuckGo()
}
因?yàn)樾‰u實(shí)現(xiàn)了鴨子的所有方法,所以小雞也是鴨。那么在 main 函數(shù)中就可以這么寫了。
func main() {
c := Chicken{}
DoDuck(c)
}
執(zhí)行正常。如此是不是很類似于其他語言的多態(tài),其實(shí)這就是 Go 多態(tài)的實(shí)現(xiàn)方法。
空接口
繼續(xù)說說空 interface。
如果一個 interface 中如果沒有定義任何方法,即為空 interface,表示為 interface{}。如此一來,任何類型就都能滿足它,這也是為什么當(dāng)函數(shù)參數(shù)類型為 interface{} 時,可以給它傳任意類型的參數(shù)。
示例代碼,如下:
package main
import "fmt"
func main() {
var i interface{} = 1
fmt.Println(i)
}
更常用的場景,Go 的 interface{} 常常會被作為函數(shù)的參數(shù)傳遞,用以幫助我們實(shí)現(xiàn)其他語言中的泛型效果。Go 中暫時不支持 泛型,不過 Go 2 的方案中似乎將支持泛型。
總結(jié)
回答結(jié)束,做個簡單總結(jié)。理解 Go 接口要記住一點(diǎn),接口是一組方法的集合,這句話非常重要,理解了這句話,再去理解 Go 的其他知識,比如類型、多態(tài)、空接口、反射、類型檢查與斷言等就會容易很多。
總結(jié)
以上是生活随笔為你收集整理的golang 切片 接口_如何理解Golang中的接口?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机裸机与应用程序及用户之间的桥梁是,
- 下一篇: huffman算法c语言实验报告,huf