溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go中怎么實現(xiàn)面向?qū)ο?/h1>
發(fā)布時間:2021-06-12 11:20:57 來源:億速云 閱讀:275 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Go中怎么實現(xiàn)面向?qū)ο蟆?,?nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“Go中怎么實現(xiàn)面向?qū)ο蟆边@篇文章吧。

在大家初識 Go 語言時,總會拿其他語言的基本特性來類比 Go 語言,說白了就是老知識和新知識產(chǎn)生關(guān)聯(lián),實現(xiàn)更高的學習效率。

Go中怎么實現(xiàn)面向?qū)ο?></p><p>最常見的類比,就是 “Go 語言如何實現(xiàn)面向?qū)ο?”,進一步展開就是 Go 語言如何實現(xiàn)面向?qū)ο筇匦灾械睦^承。</p><p>這不僅在學習中才用到類比,在業(yè)內(nèi)的 Go 面試中也有非常多的面試官喜歡問:</p><p><img src=

  • 面向?qū)ο缶幊?OOP)是一種基于 "對象"  概念的編程范式,它可以包含數(shù)據(jù)和代碼:數(shù)據(jù)以字段的形式存在(通常稱為屬性或?qū)傩?,代碼以程序的形式存在(通常稱為方法)。

  • 對象自己的程序可以訪問并經(jīng)常修改自己的數(shù)據(jù)字段。

  • 對象經(jīng)常被定義為類的一個實例。

  • 對象利用屬性和方法的私有/受保護/公共可見性,對象的內(nèi)部狀態(tài)受到保護,不受外界影響(被封裝)。

  • 基于這幾個基本認知進行一步延伸出,面向?qū)ο蟮娜蠡咎匦裕?/p>

    • 封裝。

    • 繼承。

    • 多態(tài)。

    至此對面向?qū)ο蟮幕靖拍钪v解結(jié)束,想更進一步了解的可自行網(wǎng)上沖浪。

    Go 是面向?qū)ο蟮恼Z言嗎

    “Go 語言是否一門面向?qū)ο蟮恼Z言?”,這是一個日經(jīng)話題。官方 FAQ 給出的答復是:

    Go中怎么實現(xiàn)面向?qū)ο?></p><p>是的,也不是。原因是:</p><ul class=

  • Go 有類型和方法,并且允許面向?qū)ο蟮木幊田L格,但沒有類型層次。

  • Go 中的 "接口  "概念提供了一種不同的方法,我們認為這種方法易于使用,而且在某些方面更加通用。還有一些方法可以將類型嵌入到其他類型中,以提供類似的東西,但不等同于子類。

  • Go 中的方法比 C++ 或 Java 中的方法更通用:它們可以為任何類型的數(shù)據(jù)定義,甚至是內(nèi)置類型,如普通的、"未裝箱的  "整數(shù)。它們并不局限于結(jié)構(gòu)(類)。

  • Go 由于缺乏類型層次,Go 中的 "對象 "比 C++ 或 Java 等語言更輕巧。

  • Go 實現(xiàn)面向?qū)ο缶幊?/h4>

    封裝

    面向?qū)ο笾械?“封裝” 指的是可以隱藏對象的內(nèi)部屬性和實現(xiàn)細節(jié),僅對外提供公開接口調(diào)用,這樣子用戶就不需要關(guān)注你內(nèi)部是怎么實現(xiàn)的。

    在 Go 語言中的屬性訪問權(quán)限,通過首字母大小寫來控制:

    • 首字母大寫,代表是公共的、可被外部訪問的。

    • 首字母小寫,代表是私有的,不可以被外部訪問。

    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 }

    在上述例子中,我們聲明了一個結(jié)構(gòu)體 Animal,其屬性 name 為小寫。沒法通過外部方法,在配套上存在 Setter 和 Getter  的方法,用于統(tǒng)一的訪問和設置控制。

    以此實現(xiàn)在 Go 語言中的基本封裝。

    繼承

    面向?qū)ο笾械?“繼承”  指的是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。

    Go中怎么實現(xiàn)面向?qū)ο?></p><p>圖來自網(wǎng)絡</p><p>從實際的例子來看,就是動物是一個大父類,下面又能細分為 “食草動物”、“食肉動物”,這兩者會包含 “動物” 這個父類的基本定義。</p><p>在 Go 語言中,是沒有類似 extends 關(guān)鍵字的這種繼承的方式,在語言設計上采取的是組合的方式:</p><pre>type Animal struct {  Name string }  type Cat struct {  Animal  FeatureA string }  type Dog struct {  Animal  FeatureB string }</pre><p>在上述例子中,我們聲明了 Cat 和 Dog 結(jié)構(gòu)體,其在內(nèi)部匿名組合了 Animal 結(jié)構(gòu)體。因此 Cat 和 Dog 的實例都可以調(diào)用 Animal  結(jié)構(gòu)體的方法:</p><pre>func main() {  p := NewAnimal()  p.SetName("煎魚,記得點贊~")   dog := Dog{Animal: *p}  fmt.Println(dog.GetName()) }</pre><p>同時 Cat 和 Dog 的實例可以擁有自己的方法:</p><pre>func (dog *Dog) HelloWorld() {  fmt.Println("腦子進煎魚了") }  func (cat *Cat) HelloWorld() {  fmt.Println("煎魚進腦子了") }</pre><p>上述例子能夠正常包含調(diào)用 Animal 的相關(guān)屬性和方法,也能夠擁有自己的獨立屬性和方法,在 Go 語言中達到了類似繼承的效果。</p><h4>多態(tài)</h4><p>面向?qū)ο笾械?“多態(tài)” 指的同一個行為具有多種不同表現(xiàn)形式或形態(tài)的能力,具體是指一個類實例(對象)的相同方法在不同情形有不同表現(xiàn)形式。</p><p>多態(tài)也使得不同內(nèi)部結(jié)構(gòu)的對象可以共享相同的外部接口,也就是都是一套外部模板,內(nèi)部實際是什么,只要符合規(guī)格就可以。</p><p>在 Go 語言中,多態(tài)是通過接口來實現(xiàn)的:</p><pre>type AnimalSounder interface {  MakeDNA() }  func MakeSomeDNA(animalSounder AnimalSounder) {  animalSounder.MakeDNA() }</pre><p>在上述例子中,我們聲明了一個接口類型 AnimalSounder,配套一個 MakeSomeDNA 方法,其接受 AnimalSounder  接口類型作為入?yún)ⅰ?/p><p>因此在 Go 語言中。只要配套的 Cat 和 Dog 的實例也實現(xiàn)了 MakeSomeDNA 方法,那么我們就可以認為他是 AnimalSounder  接口類型:</p><pre>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{}) }</pre><p>當 Cat 和 Dog 的實例實現(xiàn)了 AnimalSounder 接口類型的約束后,就意味著滿足了條件,他們在 Go 語言中就是一個東西。能夠作為入?yún)魅? MakeSomeDNA 方法中,再根據(jù)不同的實例實現(xiàn)多態(tài)行為。</p><h4>總結(jié)</h4><p>通過今天這篇文章,我們基本了解了面向?qū)ο蟮亩x和 Go 官方對面向?qū)ο筮@一件事的看法,同時針對面向?qū)ο蟮娜筇匦裕骸胺庋b、繼承、多態(tài)” 在 Go  語言中的實現(xiàn)方法就進行了一一講解。</p><p>在日常工作中,基本了解這些概念就可以了。若是面試,可以針對三大特性:“封裝、繼承、多態(tài)” 和 五大原則  “單一職責原則(SRP)、開放封閉原則(OCP)、里氏替換原則(LSP)、依賴倒置原則(DIP)、接口隔離原則(ISP)” 進行深入理解和說明。</p><p>在說明后針對上述提到的概念。再在 Go 語言中講解其具體的實現(xiàn)和利用到的基本原理,互相結(jié)合講解,就能得到一個不錯的效果了。</p><p class=以上是“Go中怎么實現(xiàn)面向?qū)ο蟆边@篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細節(jié)
    AI