日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Go面試官問(wèn)我如何實(shí)現(xiàn)面向?qū)ο螅?/div>

大家好,我是煎魚(yú)。

目前成都創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站改版維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、桐鄉(xiāng)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

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

最常見(jiàn)的類比,就是 “Go 語(yǔ)言如何實(shí)現(xiàn)面向?qū)ο?”,進(jìn)一步展開(kāi)就是 Go 語(yǔ)言如何實(shí)現(xiàn)面向?qū)ο筇匦灾械睦^承。

這不僅在學(xué)習(xí)中才用到類比,在業(yè)內(nèi)的 Go 面試中也有非常多的面試官喜歡問(wèn):

來(lái)自讀者微信群

在今天這篇文章中,煎魚(yú)帶大家具體展開(kāi)了解這塊的知識(shí)。一起愉快地開(kāi)始吸魚(yú)之路。

什么是面向?qū)ο?/h3>

在了解 Go 語(yǔ)言是不是面向?qū)ο?簡(jiǎn)稱:OOP) 之前,我們必須先知道 OOP 是啥,得先給他 “下定義”。

根據(jù) Wikipedia 的定義,我們梳理出 OOP 的幾個(gè)基本認(rèn)知:

  • 面向?qū)ο缶幊?OOP)是一種基于 "對(duì)象" 概念的編程范式,它可以包含數(shù)據(jù)和代碼:數(shù)據(jù)以字段的形式存在(通常稱為屬性或?qū)傩?,代碼以程序的形式存在(通常稱為方法)。
  • 對(duì)象自己的程序可以訪問(wèn)并經(jīng)常修改自己的數(shù)據(jù)字段。
  • 對(duì)象經(jīng)常被定義為類的一個(gè)實(shí)例。
  • 對(duì)象利用屬性和方法的私有/受保護(hù)/公共可見(jiàn)性,對(duì)象的內(nèi)部狀態(tài)受到保護(hù),不受外界影響(被封裝)。

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

  • 封裝。
  • 繼承。
  • 多態(tài)。

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

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

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

是的,也不是。原因是:

  • Go 有類型和方法,并且允許面向?qū)ο蟮木幊田L(fēng)格,但沒(méi)有類型層次。
  • Go 中的 "接口 "概念提供了一種不同的方法,我們認(rèn)為這種方法易于使用,而且在某些方面更加通用。還有一些方法可以將類型嵌入到其他類型中,以提供類似的東西,但不等同于子類。
  • Go 中的方法比 C++ 或 Java 中的方法更通用:它們可以為任何類型的數(shù)據(jù)定義,甚至是內(nèi)置類型,如普通的、"未裝箱的 "整數(shù)。它們并不局限于結(jié)構(gòu)(類)。
  • Go 由于缺乏類型層次,Go 中的 "對(duì)象 "比 C++ 或 Java 等語(yǔ)言更輕巧。

Go 實(shí)現(xiàn)面向?qū)ο缶幊?/h3>

封裝

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

在 Go 語(yǔ)言中的屬性訪問(wèn)權(quán)限,通過(guò)首字母大小寫(xiě)來(lái)控制:

  • 首字母大寫(xiě),代表是公共的、可被外部訪問(wèn)的。
  • 首字母小寫(xiě),代表是私有的,不可以被外部訪問(wèn)。

Go 語(yǔ)言的例子如下:

 
 
 
 
  1. type Animal struct {
  2.  name string
  3. }
  4. func NewAnimal() *Animal {
  5.  return &Animal{}
  6. }
  7. func (p *Animal) SetName(name string) {
  8.  p.name = name
  9. }
  10. func (p *Animal) GetName() string {
  11.  return p.name
  12. }

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

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

繼承

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

圖來(lái)自網(wǎng)絡(luò)

從實(shí)際的例子來(lái)看,就是動(dòng)物是一個(gè)大父類,下面又能細(xì)分為 “食草動(dòng)物”、“食肉動(dòng)物”,這兩者會(huì)包含 “動(dòng)物” 這個(gè)父類的基本定義。

在 Go 語(yǔ)言中,是沒(méi)有類似 extends 關(guān)鍵字的這種繼承的方式,在語(yǔ)言設(shè)計(jì)上采取的是組合的方式:

 
 
 
 
  1. type Animal struct {
  2.  Name string
  3. }
  4. type Cat struct {
  5.  Animal
  6.  FeatureA string
  7. }
  8. type Dog struct {
  9.  Animal
  10.  FeatureB string
  11. }

在上述例子中,我們聲明了 Cat 和 Dog 結(jié)構(gòu)體,其在內(nèi)部匿名組合了 Animal 結(jié)構(gòu)體。因此 Cat 和 Dog 的實(shí)例都可以調(diào)用 Animal 結(jié)構(gòu)體的方法:

 
 
 
 
  1. func main() {
  2.  p := NewAnimal()
  3.  p.SetName("煎魚(yú),記得點(diǎn)贊~")
  4.  dog := Dog{Animal: *p}
  5.  fmt.Println(dog.GetName())
  6. }

同時(shí) Cat 和 Dog 的實(shí)例可以擁有自己的方法:

 
 
 
 
  1. func (dog *Dog) HelloWorld() {
  2.  fmt.Println("腦子進(jìn)煎魚(yú)了")
  3. }
  4. func (cat *Cat) HelloWorld() {
  5.  fmt.Println("煎魚(yú)進(jìn)腦子了")
  6. }

上述例子能夠正常包含調(diào)用 Animal 的相關(guān)屬性和方法,也能夠擁有自己的獨(dú)立屬性和方法,在 Go 語(yǔ)言中達(dá)到了類似繼承的效果。

多態(tài)

面向?qū)ο笾械?“多態(tài)” 指的同一個(gè)行為具有多種不同表現(xiàn)形式或形態(tài)的能力,具體是指一個(gè)類實(shí)例(對(duì)象)的相同方法在不同情形有不同表現(xiàn)形式。

多態(tài)也使得不同內(nèi)部結(jié)構(gòu)的對(duì)象可以共享相同的外部接口,也就是都是一套外部模板,內(nèi)部實(shí)際是什么,只要符合規(guī)格就可以。

在 Go 語(yǔ)言中,多態(tài)是通過(guò)接口來(lái)實(shí)現(xiàn)的:

 
 
 
 
  1. type AnimalSounder interface {
  2.  MakeDNA()
  3. }
  4. func MakeSomeDNA(animalSounder AnimalSounder) {
  5.  animalSounder.MakeDNA()
  6. }

在上述例子中,我們聲明了一個(gè)接口類型 AnimalSounder,配套一個(gè) MakeSomeDNA 方法,其接受 AnimalSounder 接口類型作為入?yún)ⅰ?/p>

因此在 Go 語(yǔ)言中。只要配套的 Cat 和 Dog 的實(shí)例也實(shí)現(xiàn)了 MakeSomeDNA 方法,那么我們就可以認(rèn)為他是 AnimalSounder 接口類型:

 
 
 
 
  1. type AnimalSounder interface {
  2.  MakeDNA()
  3. }
  4. func MakeSomeDNA(animalSounder AnimalSounder) {
  5.  animalSounder.MakeDNA()
  6. }
  7. func (c *Cat) MakeDNA() {
  8.  fmt.Println("煎魚(yú)是煎魚(yú)")
  9. }
  10. func (c *Dog) MakeDNA() {
  11.  fmt.Println("煎魚(yú)其實(shí)不是煎魚(yú)")
  12. }
  13. func main() {
  14.  MakeSomeDNA(&Cat{})
  15.  MakeSomeDNA(&Dog{})
  16. }

當(dāng) Cat 和 Dog 的實(shí)例實(shí)現(xiàn)了 AnimalSounder 接口類型的約束后,就意味著滿足了條件,他們?cè)?Go 語(yǔ)言中就是一個(gè)東西。能夠作為入?yún)魅?MakeSomeDNA 方法中,再根據(jù)不同的實(shí)例實(shí)現(xiàn)多態(tài)行為。

總結(jié)

通過(guò)今天這篇文章,我們基本了解了面向?qū)ο蟮亩x和 Go 官方對(duì)面向?qū)ο筮@一件事的看法,同時(shí)針對(duì)面向?qū)ο蟮娜筇匦裕骸胺庋b、繼承、多態(tài)” 在 Go 語(yǔ)言中的實(shí)現(xiàn)方法就進(jìn)行了一一講解。

在日常工作中,基本了解這些概念就可以了。若是面試,可以針對(duì)三大特性:“封裝、繼承、多態(tài)” 和 五大原則 “單一職責(zé)原則(SRP)、開(kāi)放封閉原則(OCP)、里氏替換原則(LSP)、依賴倒置原則(DIP)、接口隔離原則(ISP)” 進(jìn)行深入理解和說(shuō)明。

在說(shuō)明后針對(duì)上述提到的概念。再在 Go 語(yǔ)言中講解其具體的實(shí)現(xiàn)和利用到的基本原理,互相結(jié)合講解,就能得到一個(gè)不錯(cuò)的效果了。

參考

Is Go an Object Oriented language?

面向?qū)ο蟮娜蠡咎卣?,五大基本原則

Go 面向?qū)ο缶幊?譯)


當(dāng)前標(biāo)題:Go面試官問(wèn)我如何實(shí)現(xiàn)面向?qū)ο螅?
URL標(biāo)題:http://www.dlmjj.cn/article/djdsegi.html