小熊不小心把自己的電腦刷成磚了。哭了。。
本來想格式化下盤,誰知道格式化完以後啥都沒有,連繫統都沒了,幾乎和 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
作爲一種優雅的語言, 給我們提供了這種解決方案,那就是鴨子類型:看起來 像鴨子, 那麼它就是 鴨子!
週末愉快~ 希望我的電腦我能自己弄好。