go中的接口與多態

小熊不小心把自己的電腦刷成磚了。哭了。。

本來想格式化下盤,誰知道格式化完以後啥都沒有,連繫統都沒了,幾乎和 rm -rf / 有得一拼!

按官網給的方法試了,啓動 u 盤製作不成功,製作成功了識別不出來,嘗試網絡恢復發現只能連美國的服務器,好不容易連上了,等了兩個小時結果無法驗證 OS !

搞了兩天到現在都沒搞定,只能等明天再背去公司試試了。

今天和大家聊聊 golang 的接口( interface

接口

接口同 java 一樣,可以把一堆有共性的方法定義在裏面,但是比 java 靈活的是,不需要顯式實現接口,你可以自己控制實現哪些方法。

不需要顯式實現的意思是,不需要像 java 那樣 implements interface 寫出來,別急,看完下面的例子就知道了。

定義一個接口。

type humanInterface interface {
	eat() string
	play() string
}

定義一個結構體(類)

type man struct {
	name string
}

實現接口,語法和 給結構體添加方法 一樣,完全看不出來 接口 的身影。

func (p man) eat() string {
	return "eat banana"
}

func (p man) play() string {
	return "play game"
}

上面的代碼給結構體添加了和接口一樣的方法,只要完全實現接口中的方式,默認這就實現接口(隱式)。

用下面這樣的格式,把結構體賦值給接口來實現他
接口實例 = new(類型)

var human humanInterface
human = new(man)
fmt.Println(human.eat())
fmt.Println(human.play())

輸出

eat banana
play game

PS: new 關鍵字和 c++ 中的不同,釋放內存由 go 的垃圾處理機來做,不需要自己釋放內存。

這不是接口

上面的是一個很簡單實現接口的例子。
要注意的是,必須實現了所有接口的方法纔算是實現了這個接口。

假如我們只實現了接口中的一個方法,會發生什麼事?

type dogInterface interface {
	eat() string
	play() string
}

type dog1 struct {
	name string
}

func (d dog1) eat() string {
	return "Eat dog food"
}

var dog dogInterface
dog = new(dog1)

報錯

報錯:Cannot use 'new(dog1)' (type *dog1) as type dogInterface in assignment
Type does not implement 'dogInterface' as some methods are missing: play() string more...

多態

當然,多態是面向對象的靈魂, go 怎麼能沒有?

這是一個以接口爲參數的函數,方法內調用了接口中方法。

func humanDoWhat(p humanInterface) {
	fmt.Println(p.eat())
	fmt.Println(p.play())
}

傳入不同的類(結構體)

w := woman{"lisa"}
m := man{"coding3min"}
// 多態的含義就是不需要修改函數,只需要修改外部實現
// 同一個接口有不同的表現
humanDoWhat(w)
humanDoWhat(m)

不同輸出

lisaeat rice
lisawatch TV
coding3mineat banana
coding3minplay game

java 中的多態有三個必要條件

  • 繼承
  • 重寫
  • 父類引用指向子類對象

但是 go 沒有繼承、重寫, go 作爲一種優雅的語言, 給我們提供了這種解決方案,那就是鴨子類型:看起來 像鴨子, 那麼它就是 鴨子

週末愉快~ 希望我的電腦我能自己弄好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章