go中如何實現多型
接觸go快半年了, 但是還是屬於那種用到時去搜尋的狀態, 沒有系統的去研究研究
go 是一種強型別的語言,每當我從php切換到go時總有些許的不適應,但是追求優雅,就不應該妥協。
go沒有 implements, extends 關鍵字,所以習慣於 OOP 程式設計,或許一開始會有點無所適從的感覺。 但go作為一種優雅的語言, 給我們提供了另一種解決方案, 那就是鴨子型別:看起來像鴨子, 那麼它就是鴨子.
那麼什麼是鴨子型別, 如何去實現呢 ?
接下來我會以一個簡單的例子來講述這種實現方案。
首先我們需要一個超類:
type Animal interface {
Sleep()
Age() int
Type() string
}
必然我們需要真正去實現這些的子類:
type Cat struct {
MaxAge int
}
func (this *Cat) Sleep() {
fmt.Println("Cat need sleep")
}
func (this *Cat) Age() int {
return this.MaxAge
}
func (this *Cat) Type() string {
return "Cat"
}
type Dog struct {
MaxAge int
}
func (this *Dog) Sleep() {
fmt.Println("Dog need sleep")
}
func (this *Dog) Age() int {
return this.MaxAge
}
func (this *Dog) Type() string {
return "Dog"
}
我們有兩個具體實現類 Cat, Dog, 但是Animal如何知道Cat, Dog已經實現了它呢? 原因在於: Cat, Dog實現了Animal中的全部方法, 那麼它就認為這就是我的子類。
那麼如何去使用這種關係呢?
func Factory(name string) Animal {
switch name {
case "dog":
return &Dog{MaxAge: 20}
case "cat":
return &Cat{MaxAge: 10}
default:
panic("No such animal")
}
}
我們使用具體工廠類來構造具體的實現類, 在呼叫時你知道有這些方法, 但是並不清楚具體的實現, 每一種型別的改變都不會影響到其它的型別。
package main
import (
"animals"
"fmt"
)
func main() {
animal := animals.Factory("dog")
animal.Sleep()
fmt.Printf("%s max age is: %d", animal.Type(), animal.Age())
}
來看看我們的輸出會是什麼吧
> Output:
animals
command-line-arguments
Dog need sleep
Dog max age is: 20
> Elapsed: 0.366s
> Result: Success
這就是go中的多型, 是不是比 implements/extends 顯示的表明關係更優雅呢。
相關文章
- Go 如何實現多型Go多型
- 什麼是Java多型?如何實現Java多型?Java多型
- Golang | Go語言多型的實現與interface使用Golang多型
- 在Go中如何實現併發Go
- 如何利用go-zero在Go中快速實現JWT認證GoJWT
- Python 3.6:多型的實現Python多型
- 實現多型多對多 幾個注意點多型
- 深入解析多型和方法呼叫在JVM中的實現多型JVM
- dubbo-go 中如何實現遠端配置管理Go
- Java中如何使用泛型實現介面中的列表集合?Java泛型
- Go 如何實現熱重啟Go
- GO 中 string 的實現原理Go
- GO 中 slice 的實現原理Go
- GO 中 map 的實現原理Go
- GO 中 defer的實現原理Go
- 用Go語言實現多協程檔案上傳,斷點續傳,你如何實現?Go斷點
- aardio 實現封裝繼承多型封裝繼承多型
- Java多型實現的必要條件Java多型
- C語言實現繼承多型C語言繼承多型
- IOS多型別Cell的tableView實現iOS多型型別View
- C++ 多型的實現及原理C++多型
- java中介面多個實現類,如何指定實現類,根據子類型別選擇實現方法Java型別
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- 如何在 Go 中將 int 型別轉為字串Go型別字串
- 多雲已成現實,企業如何更好地實現多雲管理?
- 如何實現多執行緒執行緒
- Redis如何實現多可用區?Redis
- [MAUI程式設計]介面多型與實現UI程式設計多型
- python多執行緒中訊息佇列如何實現?Python執行緒佇列
- go如何實現openai伺服器推送GoOpenAI伺服器
- 如何用Go快速實現規則引擎Go
- Go 中的 channel 怎麼實現的?Go
- 深入解析 Go 中 Slice 底層實現Go
- GO實現Redis:GO實現Redis叢集(5)GoRedis
- JavaScript如何實現多執行緒?JavaScript執行緒
- 實現TypeScript中的互斥型別TypeScript型別
- Java 介面實現多型 -- 膝上型電腦綜合例項Java多型
- 使用Go實現健壯的記憶體型快取Go記憶體快取
- Go型別嵌入介紹和使用型別嵌入模擬實現“繼承”Go型別繼承