一文帶你搞明白Go中的面向?qū)ο?/h1>
更新時間:2023年07月20日 11:29:56 作者:Mandy的名字被占用了
這篇文章主要為大家詳細(xì)介紹了Go語言中面向?qū)ο蟮南嚓P(guān)知識,文中的示例代碼講解詳細(xì),對我們深入了解Go語言有一定的幫助,需要的可以參考一下
大家好,我是Mandy。
前面一篇,分享了Go中的函數(shù)和方法之間有什么區(qū)別、如何使用,今天來分享一篇關(guān)于面向?qū)ο蟮闹R。
萬丈高樓平地起
在學(xué)習(xí)之前,我們來普及一下關(guān)于面向?qū)ο蟮幕A(chǔ)知識。
什么是面向?qū)ο?/h2>
面向?qū)ο螅∣bject-Oriented)是一種計算機編程的方法和思想,它將程序中的數(shù)據(jù)(對象)和操作(方法)組織成一個個相互關(guān)聯(lián)和交互的對象。對象是現(xiàn)實世界中的事物或概念在計算機程序中的抽象表示。
面向?qū)ο缶幊痰暮诵乃枷胧菍栴}分解為一組相互作用的對象,每個對象都具有自己的狀態(tài)(屬性或數(shù)據(jù))和行為(方法或操作),并通過對象之間的消息傳遞來進(jìn)行協(xié)作和交互。

總結(jié)一句,面向?qū)ο缶褪菍⒁恍┚哂邢嗤匦缘氖挛?,通過類的形式進(jìn)行統(tǒng)一封裝。封裝的類中的屬性和方法,就是事物間具有相同的特征和行為。例如,人有身高、體重和跑步的行為。身高和體重對應(yīng)類中的屬性,跑步對應(yīng)類中的方法。
面向?qū)ο蟮膬?yōu)勢
面向?qū)ο笥袔状筇攸c,封裝、繼承和多態(tài),針對這些特點,可以總結(jié)出如下的幾個優(yōu)勢:
1、模塊化和可重用性:面向?qū)ο缶幊淘试S將代碼組織成獨立的對象或類,每個對象都具有特定的功能和行為。這種模塊化的方式使代碼更易于理解、維護(hù)和重用,可以提高開發(fā)效率。
2、封裝和信息隱藏:面向?qū)ο缶幊掏ㄟ^封裝將數(shù)據(jù)和相關(guān)方法封裝在對象內(nèi)部,隱藏了對象的實現(xiàn)細(xì)節(jié),只暴露必要的接口。這樣可以防止外部代碼直接訪問和修改對象的內(nèi)部狀態(tài),提高代碼的安全性和可靠性。
3、繼承和代碼復(fù)用:繼承是面向?qū)ο缶幊痰囊粋€重要概念,它允許通過從現(xiàn)有類派生出新類來擴展和重用代碼。子類可以繼承父類的屬性和方法,并可以添加、修改或覆蓋這些屬性和方法,從而實現(xiàn)代碼的復(fù)用和擴展。
4、多態(tài)和靈活性:多態(tài)是面向?qū)ο缶幊痰牧硪粋€重要概念,它允許同一種行為有不同的表現(xiàn)形式。通過多態(tài),可以根據(jù)對象的實際類型來調(diào)用相應(yīng)的方法,這樣可以增加代碼的靈活性和可擴展性。
5、更易于理解和維護(hù):面向?qū)ο缶幊烫峁┝艘环N自然的思維方式,能夠更好地模擬和表示現(xiàn)實世界的概念和關(guān)系。這樣使得代碼更易于理解、調(diào)試和維護(hù),減少了代碼的復(fù)雜性和耦合性。
總的來說,面向?qū)ο缶幊陶Z言提供了一套豐富的概念和技術(shù),在代碼結(jié)構(gòu)、復(fù)用性、可維護(hù)性和靈活性等方面具有明顯的優(yōu)勢,使得軟件開發(fā)更加高效和可靠。
Go中的面向?qū)ο?/h2>
相信從你剛開始學(xué)習(xí)Go時,以及使用Go參與項目,都知道Go中沒有面向?qū)ο筮@樣的概念。但在實際的項目開發(fā)中,為了提高代碼的可維護(hù)性、可擴展性和可復(fù)用性等特點,你不得不使用面向?qū)ο蟮脑O(shè)計理念來編碼。

那該怎么實現(xiàn)呢,答案就是使用Go中結(jié)構(gòu)體來實現(xiàn)。
需要注意的是,本文不會單獨去講結(jié)構(gòu)體的語法內(nèi)容。重點是總結(jié)結(jié)構(gòu)體與面向?qū)ο蟮膮^(qū)別。
什么是結(jié)構(gòu)體
在Go語言中,結(jié)構(gòu)體(Struct)是一種自定義數(shù)據(jù)類型,用于組織和存儲一組相關(guān)字段的集合
。它類似于其他編程語言中的類或?qū)ο?,是一種將數(shù)據(jù)和相關(guān)方法組合在一起的容器。
1、結(jié)構(gòu)體的字段就類似于面向?qū)ο笾械膶傩浴?/p>
2、結(jié)構(gòu)體的方法就類似于面向?qū)ο笾械姆椒ā?/p>
要定義一個結(jié)構(gòu)體非常的簡單,其語法格式如下:
type 結(jié)構(gòu)體名稱 struct {
字段名 字段屬性
}
func (接受者) 方法名稱([方法參數(shù)]) [方法返回值] {
}
下面我們就來實際定義一個結(jié)構(gòu)體。
package main
import "fmt"
type Animal struct {
name string
age string
height float64
weight float64
}
func (u Animal) run() {
fmt.Println(u.name, "跑步的速度很快")
}
func main() {
animal1 := &Animal{
name: "鴕鳥",
}
animal1.run()
// output:鴕鳥 跑步的速度很快
}
1、定義一個名為Animal的結(jié)構(gòu)體,就相當(dāng)于面向?qū)ο笾械念悺?/p>
2、定義name、age等字段,就相當(dāng)于面向?qū)ο笾械膶傩浴?/p>
3、定義run()方法,就相當(dāng)于面向?qū)ο笾械姆椒?。記住:方法一定是要有一個接收者的,這里的接收者為結(jié)構(gòu)體Animal,其實就是將這個方法歸屬到結(jié)構(gòu)體Animal。就好比在類中定義一個方法,這個方法就是屬于這個類。
4、使用&Animal{},就相當(dāng)于面向?qū)ο蟮膶嵗惖倪^程。
5、使用animal1.run(),就相當(dāng)于實例化了一個對象,通過對象去調(diào)用方法。
是不是發(fā)現(xiàn)使用struct,實現(xiàn)面向?qū)ο笫欠浅:唵巍?/strong>
對象繼承
在具有面向?qū)ο蟮拈_發(fā)語言中,使用對象繼承,都是使用關(guān)鍵字extend
關(guān)鍵字來實現(xiàn)。在Go中,可以使用結(jié)構(gòu)體嵌套
的方式來實現(xiàn)繼承關(guān)系。
package main
import "fmt"
type Animal struct {
name string
age string
height float64
weight float64
}
type Dog struct {
Animal
color string
}
func (u Animal) run() {
fmt.Println(u.name, "跑步的速度很快")
}
func (d Dog) sleep() {
fmt.Println(d.name, "晚上很少睡覺")
}
func main() {
dog := &Dog{
Animal{name: "小狗"},
}
dog.sleep()
dog.run()
}
1、上述定義了一個Animal的結(jié)構(gòu)體,作為父類結(jié)構(gòu)體。同時定義了一個run()方法,當(dāng)做父類的方法,定義了4個字段當(dāng)做父類的屬性。
2、接著定義了一個Dog結(jié)構(gòu)體,嵌入了一個Animal的結(jié)構(gòu)體,此時兩個結(jié)構(gòu)體就實現(xiàn)了一個繼承的關(guān)系。
3、Dog結(jié)構(gòu)體自身也定義了一個sleep()的方法。這時,Dog結(jié)構(gòu)體具備父類結(jié)構(gòu)體的所有方法和屬性,同時也有自己的屬性和方法。
需要注意的是,結(jié)構(gòu)體的嵌套,可以是外部包,也可以是本包。方法的接收者必須是本包的結(jié)構(gòu)體,不能是外部包。
此致,結(jié)構(gòu)體實現(xiàn)對象的特性,就總結(jié)的差不多了。記住Go中的機構(gòu)體不僅能實現(xiàn)面向?qū)ο蟮奶匦裕瑫r還具有其他更強大的功能。這里簡單的舉例。
type user struct {
name string `json:"name"`
}
上面的寫法,相信大家在很多的第三方包,以及項目開發(fā)中都能遇到。通過定義一個tag,可以將元數(shù)據(jù)通過tag的定義方式,暴露給外部。
總結(jié)
在Go語言中,struct是一種用戶自定義的數(shù)據(jù)類型,用于組織和存儲不同字段類型的數(shù)據(jù)。它類似于其他編程語言中的結(jié)構(gòu)體,但在Go中,struct不具備面向?qū)ο缶幊讨蓄惖乃刑匦?。以下是struct與面向?qū)ο蟮闹饕獏^(qū)別:
1、繼承:Go語言中的struct不支持繼承,無法通過一個struct來繼承另一個struct的成員和方法。而面向?qū)ο缶幊讨校愔g可以通過繼承來共享和擴展功能。
2、封裝:在面向?qū)ο缶幊讨校惖某蓡T和方法可以進(jìn)行封裝,通過訪問修飾符來控制其可見性。而在Go中,struct的成員默認(rèn)是公開的,可以被外部訪問,無法像類一樣進(jìn)行嚴(yán)格封裝。
3、多態(tài):面向?qū)ο缶幊讨С侄鄳B(tài)性,一個對象可以根據(jù)不同的上下文表現(xiàn)出不同的行為。而Go語言中的struct不直接支持多態(tài),但可以通過接口來實現(xiàn)類似的效果。
總的來說,雖然Go語言的struct不同于傳統(tǒng)的面向?qū)ο缶幊陶Z言中的類,但通過結(jié)合使用接口、嵌入等語言特性,我們?nèi)匀豢梢栽贕o中實現(xiàn)類似面向?qū)ο蟮脑O(shè)計和編程范式。
到此這篇關(guān)于一文帶你搞明白Go中的面向?qū)ο蟮奈恼戮徒榻B到這了,更多相關(guān)Go面向?qū)ο髢?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
Go 通過結(jié)構(gòu)struct實現(xiàn)接口interface的問題
這篇文章主要介紹了Go 通過結(jié)構(gòu)struct實現(xiàn)接口interface的問題,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下 2021-10-10
-
Go語言通過chan進(jìn)行數(shù)據(jù)傳遞的方法詳解
這篇文章主要為大家詳細(xì)介紹了Go語言如何通過chan進(jìn)行數(shù)據(jù)傳遞的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下 2023-06-06
-
詳解Go語言中關(guān)于包導(dǎo)入必學(xué)的 8 個知識點
這篇文章主要介紹了詳解Go語言中關(guān)于包導(dǎo)入必學(xué)的 8 個知識點,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧 2020-08-08
-
Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏
這篇文章主要介紹了Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教 2024-01-01
最新評論
大家好,我是Mandy。
前面一篇,分享了Go中的函數(shù)和方法之間有什么區(qū)別、如何使用,今天來分享一篇關(guān)于面向?qū)ο蟮闹R。
萬丈高樓平地起
在學(xué)習(xí)之前,我們來普及一下關(guān)于面向?qū)ο蟮幕A(chǔ)知識。
什么是面向?qū)ο?/h2>
面向?qū)ο螅∣bject-Oriented)是一種計算機編程的方法和思想,它將程序中的數(shù)據(jù)(對象)和操作(方法)組織成一個個相互關(guān)聯(lián)和交互的對象。對象是現(xiàn)實世界中的事物或概念在計算機程序中的抽象表示。
面向?qū)ο缶幊痰暮诵乃枷胧菍栴}分解為一組相互作用的對象,每個對象都具有自己的狀態(tài)(屬性或數(shù)據(jù))和行為(方法或操作),并通過對象之間的消息傳遞來進(jìn)行協(xié)作和交互。
總結(jié)一句,面向?qū)ο缶褪菍⒁恍┚哂邢嗤匦缘氖挛?,通過類的形式進(jìn)行統(tǒng)一封裝。封裝的類中的屬性和方法,就是事物間具有相同的特征和行為。例如,人有身高、體重和跑步的行為。身高和體重對應(yīng)類中的屬性,跑步對應(yīng)類中的方法。
面向?qū)ο蟮膬?yōu)勢
面向?qū)ο笥袔状筇攸c,封裝、繼承和多態(tài),針對這些特點,可以總結(jié)出如下的幾個優(yōu)勢:
1、模塊化和可重用性:面向?qū)ο缶幊淘试S將代碼組織成獨立的對象或類,每個對象都具有特定的功能和行為。這種模塊化的方式使代碼更易于理解、維護(hù)和重用,可以提高開發(fā)效率。
2、封裝和信息隱藏:面向?qū)ο缶幊掏ㄟ^封裝將數(shù)據(jù)和相關(guān)方法封裝在對象內(nèi)部,隱藏了對象的實現(xiàn)細(xì)節(jié),只暴露必要的接口。這樣可以防止外部代碼直接訪問和修改對象的內(nèi)部狀態(tài),提高代碼的安全性和可靠性。
3、繼承和代碼復(fù)用:繼承是面向?qū)ο缶幊痰囊粋€重要概念,它允許通過從現(xiàn)有類派生出新類來擴展和重用代碼。子類可以繼承父類的屬性和方法,并可以添加、修改或覆蓋這些屬性和方法,從而實現(xiàn)代碼的復(fù)用和擴展。
4、多態(tài)和靈活性:多態(tài)是面向?qū)ο缶幊痰牧硪粋€重要概念,它允許同一種行為有不同的表現(xiàn)形式。通過多態(tài),可以根據(jù)對象的實際類型來調(diào)用相應(yīng)的方法,這樣可以增加代碼的靈活性和可擴展性。
5、更易于理解和維護(hù):面向?qū)ο缶幊烫峁┝艘环N自然的思維方式,能夠更好地模擬和表示現(xiàn)實世界的概念和關(guān)系。這樣使得代碼更易于理解、調(diào)試和維護(hù),減少了代碼的復(fù)雜性和耦合性。
總的來說,面向?qū)ο缶幊陶Z言提供了一套豐富的概念和技術(shù),在代碼結(jié)構(gòu)、復(fù)用性、可維護(hù)性和靈活性等方面具有明顯的優(yōu)勢,使得軟件開發(fā)更加高效和可靠。
Go中的面向?qū)ο?/h2>
相信從你剛開始學(xué)習(xí)Go時,以及使用Go參與項目,都知道Go中沒有面向?qū)ο筮@樣的概念。但在實際的項目開發(fā)中,為了提高代碼的可維護(hù)性、可擴展性和可復(fù)用性等特點,你不得不使用面向?qū)ο蟮脑O(shè)計理念來編碼。
那該怎么實現(xiàn)呢,答案就是使用Go中結(jié)構(gòu)體來實現(xiàn)。
需要注意的是,本文不會單獨去講結(jié)構(gòu)體的語法內(nèi)容。重點是總結(jié)結(jié)構(gòu)體與面向?qū)ο蟮膮^(qū)別。
什么是結(jié)構(gòu)體
在Go語言中,結(jié)構(gòu)體(Struct)是一種自定義數(shù)據(jù)類型,用于組織和存儲一組相關(guān)字段的集合
。它類似于其他編程語言中的類或?qū)ο?,是一種將數(shù)據(jù)和相關(guān)方法組合在一起的容器。
1、結(jié)構(gòu)體的字段就類似于面向?qū)ο笾械膶傩浴?/p>
2、結(jié)構(gòu)體的方法就類似于面向?qū)ο笾械姆椒ā?/p>
要定義一個結(jié)構(gòu)體非常的簡單,其語法格式如下:
type 結(jié)構(gòu)體名稱 struct {
字段名 字段屬性
}
func (接受者) 方法名稱([方法參數(shù)]) [方法返回值] {
}
下面我們就來實際定義一個結(jié)構(gòu)體。
package main import "fmt" type Animal struct { name string age string height float64 weight float64 } func (u Animal) run() { fmt.Println(u.name, "跑步的速度很快") } func main() { animal1 := &Animal{ name: "鴕鳥", } animal1.run() // output:鴕鳥 跑步的速度很快 }
1、定義一個名為Animal的結(jié)構(gòu)體,就相當(dāng)于面向?qū)ο笾械念悺?/p>
2、定義name、age等字段,就相當(dāng)于面向?qū)ο笾械膶傩浴?/p>
3、定義run()方法,就相當(dāng)于面向?qū)ο笾械姆椒?。記住:方法一定是要有一個接收者的,這里的接收者為結(jié)構(gòu)體Animal,其實就是將這個方法歸屬到結(jié)構(gòu)體Animal。就好比在類中定義一個方法,這個方法就是屬于這個類。
4、使用&Animal{},就相當(dāng)于面向?qū)ο蟮膶嵗惖倪^程。
5、使用animal1.run(),就相當(dāng)于實例化了一個對象,通過對象去調(diào)用方法。
是不是發(fā)現(xiàn)使用struct,實現(xiàn)面向?qū)ο笫欠浅:唵巍?/strong>
對象繼承
在具有面向?qū)ο蟮拈_發(fā)語言中,使用對象繼承,都是使用關(guān)鍵字extend
關(guān)鍵字來實現(xiàn)。在Go中,可以使用結(jié)構(gòu)體嵌套
的方式來實現(xiàn)繼承關(guān)系。
package main import "fmt" type Animal struct { name string age string height float64 weight float64 } type Dog struct { Animal color string } func (u Animal) run() { fmt.Println(u.name, "跑步的速度很快") } func (d Dog) sleep() { fmt.Println(d.name, "晚上很少睡覺") } func main() { dog := &Dog{ Animal{name: "小狗"}, } dog.sleep() dog.run() }
1、上述定義了一個Animal的結(jié)構(gòu)體,作為父類結(jié)構(gòu)體。同時定義了一個run()方法,當(dāng)做父類的方法,定義了4個字段當(dāng)做父類的屬性。
2、接著定義了一個Dog結(jié)構(gòu)體,嵌入了一個Animal的結(jié)構(gòu)體,此時兩個結(jié)構(gòu)體就實現(xiàn)了一個繼承的關(guān)系。
3、Dog結(jié)構(gòu)體自身也定義了一個sleep()的方法。這時,Dog結(jié)構(gòu)體具備父類結(jié)構(gòu)體的所有方法和屬性,同時也有自己的屬性和方法。
需要注意的是,結(jié)構(gòu)體的嵌套,可以是外部包,也可以是本包。方法的接收者必須是本包的結(jié)構(gòu)體,不能是外部包。
此致,結(jié)構(gòu)體實現(xiàn)對象的特性,就總結(jié)的差不多了。記住Go中的機構(gòu)體不僅能實現(xiàn)面向?qū)ο蟮奶匦裕瑫r還具有其他更強大的功能。這里簡單的舉例。
type user struct { name string `json:"name"` }
上面的寫法,相信大家在很多的第三方包,以及項目開發(fā)中都能遇到。通過定義一個tag,可以將元數(shù)據(jù)通過tag的定義方式,暴露給外部。
總結(jié)
在Go語言中,struct是一種用戶自定義的數(shù)據(jù)類型,用于組織和存儲不同字段類型的數(shù)據(jù)。它類似于其他編程語言中的結(jié)構(gòu)體,但在Go中,struct不具備面向?qū)ο缶幊讨蓄惖乃刑匦?。以下是struct與面向?qū)ο蟮闹饕獏^(qū)別:
1、繼承:Go語言中的struct不支持繼承,無法通過一個struct來繼承另一個struct的成員和方法。而面向?qū)ο缶幊讨校愔g可以通過繼承來共享和擴展功能。
2、封裝:在面向?qū)ο缶幊讨校惖某蓡T和方法可以進(jìn)行封裝,通過訪問修飾符來控制其可見性。而在Go中,struct的成員默認(rèn)是公開的,可以被外部訪問,無法像類一樣進(jìn)行嚴(yán)格封裝。
3、多態(tài):面向?qū)ο缶幊讨С侄鄳B(tài)性,一個對象可以根據(jù)不同的上下文表現(xiàn)出不同的行為。而Go語言中的struct不直接支持多態(tài),但可以通過接口來實現(xiàn)類似的效果。
總的來說,雖然Go語言的struct不同于傳統(tǒng)的面向?qū)ο缶幊陶Z言中的類,但通過結(jié)合使用接口、嵌入等語言特性,我們?nèi)匀豢梢栽贕o中實現(xiàn)類似面向?qū)ο蟮脑O(shè)計和編程范式。
到此這篇關(guān)于一文帶你搞明白Go中的面向?qū)ο蟮奈恼戮徒榻B到這了,更多相關(guān)Go面向?qū)ο髢?nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go 通過結(jié)構(gòu)struct實現(xiàn)接口interface的問題
這篇文章主要介紹了Go 通過結(jié)構(gòu)struct實現(xiàn)接口interface的問題,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10Go語言通過chan進(jìn)行數(shù)據(jù)傳遞的方法詳解
這篇文章主要為大家詳細(xì)介紹了Go語言如何通過chan進(jìn)行數(shù)據(jù)傳遞的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-06-06詳解Go語言中關(guān)于包導(dǎo)入必學(xué)的 8 個知識點
這篇文章主要介紹了詳解Go語言中關(guān)于包導(dǎo)入必學(xué)的 8 個知識點,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏
這篇文章主要介紹了Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01