您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Go中怎么實現面向對象”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Go中怎么實現面向對象”這篇文章吧。
在大家初識 Go 語言時,總會拿其他語言的基本特性來類比 Go 語言,說白了就是老知識和新知識產生關聯,實現更高的學習效率。
最常見的類比,就是 “Go 語言如何實現面向對象?”,進一步展開就是 Go 語言如何實現面向對象特性中的繼承。
這不僅在學習中才用到類比,在業內的 Go 面試中也有非常多的面試官喜歡問:
來自讀者微信群
在今天這篇文章中,煎魚帶大家具體展開了解這塊的知識。一起愉快地開始吸魚之路。
在了解 Go 語言是不是面向對象(簡稱:OOP) 之前,我們必須先知道 OOP 是啥,得先給他 “下定義”。
根據 Wikipedia 的定義,我們梳理出 OOP 的幾個基本認知:
面向對象編程(OOP)是一種基于 "對象" 概念的編程范式,它可以包含數據和代碼:數據以字段的形式存在(通常稱為屬性或屬性),代碼以程序的形式存在(通常稱為方法)。
對象自己的程序可以訪問并經常修改自己的數據字段。
對象經常被定義為類的一個實例。
對象利用屬性和方法的私有/受保護/公共可見性,對象的內部狀態受到保護,不受外界影響(被封裝)。
基于這幾個基本認知進行一步延伸出,面向對象的三大基本特性:
封裝。
繼承。
多態。
至此對面向對象的基本概念講解結束,想更進一步了解的可自行網上沖浪。
“Go 語言是否一門面向對象的語言?”,這是一個日經話題。官方 FAQ 給出的答復是:
是的,也不是。原因是:
Go 有類型和方法,并且允許面向對象的編程風格,但沒有類型層次。
Go 中的 "接口 "概念提供了一種不同的方法,我們認為這種方法易于使用,而且在某些方面更加通用。還有一些方法可以將類型嵌入到其他類型中,以提供類似的東西,但不等同于子類。
Go 中的方法比 C++ 或 Java 中的方法更通用:它們可以為任何類型的數據定義,甚至是內置類型,如普通的、"未裝箱的 "整數。它們并不局限于結構(類)。
Go 由于缺乏類型層次,Go 中的 "對象 "比 C++ 或 Java 等語言更輕巧。
封裝
面向對象中的 “封裝” 指的是可以隱藏對象的內部屬性和實現細節,僅對外提供公開接口調用,這樣子用戶就不需要關注你內部是怎么實現的。
在 Go 語言中的屬性訪問權限,通過首字母大小寫來控制:
首字母大寫,代表是公共的、可被外部訪問的。
首字母小寫,代表是私有的,不可以被外部訪問。
Go 語言的例子如下:
type Animal struct { name string } func NewAnimal() *Animal { return &Animal{} } func (p *Animal) SetName(name string) { p.name = name } func (p *Animal) GetName() string { return p.name }
在上述例子中,我們聲明了一個結構體 Animal,其屬性 name 為小寫。沒法通過外部方法,在配套上存在 Setter 和 Getter 的方法,用于統一的訪問和設置控制。
以此實現在 Go 語言中的基本封裝。
面向對象中的 “繼承” 指的是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
圖來自網絡
從實際的例子來看,就是動物是一個大父類,下面又能細分為 “食草動物”、“食肉動物”,這兩者會包含 “動物” 這個父類的基本定義。
在 Go 語言中,是沒有類似 extends 關鍵字的這種繼承的方式,在語言設計上采取的是組合的方式:
type Animal struct { Name string } type Cat struct { Animal FeatureA string } type Dog struct { Animal FeatureB string }
在上述例子中,我們聲明了 Cat 和 Dog 結構體,其在內部匿名組合了 Animal 結構體。因此 Cat 和 Dog 的實例都可以調用 Animal 結構體的方法:
func main() { p := NewAnimal() p.SetName("煎魚,記得點贊~") dog := Dog{Animal: *p} fmt.Println(dog.GetName()) }
同時 Cat 和 Dog 的實例可以擁有自己的方法:
func (dog *Dog) HelloWorld() { fmt.Println("腦子進煎魚了") } func (cat *Cat) HelloWorld() { fmt.Println("煎魚進腦子了") }
上述例子能夠正常包含調用 Animal 的相關屬性和方法,也能夠擁有自己的獨立屬性和方法,在 Go 語言中達到了類似繼承的效果。
面向對象中的 “多態” 指的同一個行為具有多種不同表現形式或形態的能力,具體是指一個類實例(對象)的相同方法在不同情形有不同表現形式。
多態也使得不同內部結構的對象可以共享相同的外部接口,也就是都是一套外部模板,內部實際是什么,只要符合規格就可以。
在 Go 語言中,多態是通過接口來實現的:
type AnimalSounder interface { MakeDNA() } func MakeSomeDNA(animalSounder AnimalSounder) { animalSounder.MakeDNA() }
在上述例子中,我們聲明了一個接口類型 AnimalSounder,配套一個 MakeSomeDNA 方法,其接受 AnimalSounder 接口類型作為入參。
因此在 Go 語言中。只要配套的 Cat 和 Dog 的實例也實現了 MakeSomeDNA 方法,那么我們就可以認為他是 AnimalSounder 接口類型:
type AnimalSounder interface { MakeDNA() } func MakeSomeDNA(animalSounder AnimalSounder) { animalSounder.MakeDNA() } func (c *Cat) MakeDNA() { fmt.Println("煎魚是煎魚") } func (c *Dog) MakeDNA() { fmt.Println("煎魚其實不是煎魚") } func main() { MakeSomeDNA(&Cat{}) MakeSomeDNA(&Dog{}) }
當 Cat 和 Dog 的實例實現了 AnimalSounder 接口類型的約束后,就意味著滿足了條件,他們在 Go 語言中就是一個東西。能夠作為入參傳入 MakeSomeDNA 方法中,再根據不同的實例實現多態行為。
通過今天這篇文章,我們基本了解了面向對象的定義和 Go 官方對面向對象這一件事的看法,同時針對面向對象的三大特性:“封裝、繼承、多態” 在 Go 語言中的實現方法就進行了一一講解。
在日常工作中,基本了解這些概念就可以了。若是面試,可以針對三大特性:“封裝、繼承、多態” 和 五大原則 “單一職責原則(SRP)、開放封閉原則(OCP)、里氏替換原則(LSP)、依賴倒置原則(DIP)、接口隔離原則(ISP)” 進行深入理解和說明。
在說明后針對上述提到的概念。再在 Go 語言中講解其具體的實現和利用到的基本原理,互相結合講解,就能得到一個不錯的效果了。
以上是“Go中怎么實現面向對象”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。