深入理解GO語(yǔ)言的面向?qū)ο?/h1>
更新時(shí)間:2016年10月04日 10:44:02 作者:Summer7C
相信很多人當(dāng)初開(kāi)發(fā)go語(yǔ)言的時(shí)候就是因?yàn)镃++的特性太過(guò)于繁雜,從而使得很多C++的開(kāi)發(fā)者因?yàn)镃++的特性而頭疼,go語(yǔ)言成功的精簡(jiǎn)了C++的特性,使其很簡(jiǎn)潔,很少的特性,卻可以完成很多的事情。下面我們就來(lái)詳細(xì)理解下GO語(yǔ)言的面向?qū)ο蟆?/div>
前言
有過(guò)C++語(yǔ)言學(xué)習(xí)經(jīng)歷的朋友都知道,面向?qū)ο笾饕巳齻€(gè)基本特征:封裝、繼承和多態(tài)。封裝,就是指運(yùn)行的數(shù)據(jù)和函數(shù)綁定在一起,C++中主要是通過(guò)this指針來(lái)完成的;繼承,就是指class之間可以相互繼承屬性和函數(shù);多態(tài),主要就是用統(tǒng)一的接口來(lái)處理通用的邏輯,每個(gè)class只需要按照接口實(shí)現(xiàn)自己的回調(diào)函數(shù)就可以了。
作為集大成者的Go語(yǔ)言,自然不會(huì)在面向?qū)ο笊厦鏌o(wú)所作為。相比較C++、Java、C#等面向?qū)ο笳Z(yǔ)言而言,它的面向?qū)ο蟾?jiǎn)單,也更容易理解。
go語(yǔ)言中并沒(méi)有像C++,Java語(yǔ)言中這類的Class,它只含有像C語(yǔ)言中的結(jié)構(gòu)體,用結(jié)構(gòu)體和指針等特性,完成一個(gè)類的作用,很巧妙的使用了指針和結(jié)構(gòu)體,不僅是go的面向?qū)ο?,包括go語(yǔ)言中的map等操作都是借助了結(jié)構(gòu)體。其實(shí),說(shuō)白了,C++、Java等面向?qū)ο蟮恼Z(yǔ)言中,類的底層實(shí)現(xiàn)就是結(jié)構(gòu)體,對(duì)象的引用就是指針,只是語(yǔ)言把他們封裝起來(lái)了而已。然而這使得很多人剛接觸面向?qū)ο蟮臅r(shí)候很不理解這些東西。
下面,說(shuō)所面向?qū)ο笤趃o中的寫(xiě)法:
如果我們要再Java中定義一個(gè)Rect,可以求其面積,我們應(yīng)該這么寫(xiě)
public class Rect {
public int x;
public int y;
public int Area() {
return x*y;
}
}
很簡(jiǎn)單,那么Go語(yǔ)言中怎么做呢?Go中并不存在所謂的類,所有的類都是用結(jié)構(gòu)體表示的,所以要寫(xiě)一個(gè)類,我們先得定義一個(gè)結(jié)構(gòu)體:
type Rect struct {
x, y int
}
這是一個(gè)Rect的結(jié)構(gòu)體,那么一個(gè)類中,不僅要存在變量,還要有成員函數(shù),那么go的成員函數(shù)是這么寫(xiě)的:
func (r *Rect) Area() int {
return r.x*r.y
}
這個(gè)成員函數(shù)的功能是求面積的,顯然,這個(gè)成員函數(shù)值對(duì)Rect的結(jié)構(gòu)體適用,這樣就實(shí)現(xiàn)了所謂的封裝,那么,我們?nèi)绾稳?chuàng)建并初始化類的實(shí)例呢
go語(yǔ)言提供了很多方式:
rect :=new(Rect)
rect :=&Rect{}
rect :=&Rect{1,2}
rect :=&Rect{x:3,y:4}
那么,一遍情況下,如果沒(méi)有指定成員變量的大小,go語(yǔ)言會(huì)默認(rèn)初始化成員變量為0,bool
類型的為false
。
那么,構(gòu)造函數(shù)呢?
我們可以這么來(lái)寫(xiě):
func NewRect(x,y int) *Rect {
return &Rect{x,y}
}
其實(shí),這也是我們平時(shí)new一個(gè)對(duì)象時(shí)候的真正操作,只是go把他真正展現(xiàn)給我們了。
看到這里,我們似乎還有一個(gè)疑問(wèn),那就是,像java、C++中對(duì)于可見(jiàn)性的描述呢,go語(yǔ)言中不存在public
等關(guān)鍵字,go語(yǔ)言中直接選擇用字母大小寫(xiě)控制。
一個(gè)變量以大寫(xiě)字母開(kāi)頭則表示對(duì)其他包可見(jiàn),如果想要不可見(jiàn),那么使用小寫(xiě)字母即可,但是go語(yǔ)言中的可見(jiàn)性控制只是針對(duì)包的,并不針對(duì)類,也就是,同一個(gè)包下的類都是可見(jiàn)的。這個(gè)時(shí)候我們就可以知道了為什么輸出語(yǔ)句是這樣寫(xiě)的了吧:
fmt.Println("hello world")
因?yàn)榇撕瘮?shù)對(duì)其他包是可見(jiàn)的。
總結(jié)
以上就是GO語(yǔ)言面向?qū)ο蟮娜績(jī)?nèi)容,希望這篇文章的內(nèi)容對(duì)大家學(xué)習(xí)或者使用GO語(yǔ)言能有所幫助,如果有疑問(wèn)大家可以留言交流。
您可能感興趣的文章:- Go語(yǔ)言基礎(chǔ)語(yǔ)法之結(jié)構(gòu)體及方法詳解
- go語(yǔ)言基礎(chǔ)語(yǔ)法示例
- Go語(yǔ)言入門教程之基礎(chǔ)語(yǔ)法快速入門
- go語(yǔ)言中的面向?qū)ο?/a>
- GO語(yǔ)言結(jié)構(gòu)體面向?qū)ο蟛僮魇纠?/a>
- GO語(yǔ)言并發(fā)編程之互斥鎖、讀寫(xiě)鎖詳解
- Go語(yǔ)言并發(fā)技術(shù)詳解
- Go語(yǔ)言如何并發(fā)超時(shí)處理詳解
- Go語(yǔ)言并發(fā)模型的2種編程方案
- go語(yǔ)言限制協(xié)程并發(fā)數(shù)的方案詳情
- Go語(yǔ)言中map使用和并發(fā)安全詳解
- 通過(guò)與Java功能上的對(duì)比來(lái)學(xué)習(xí)Go語(yǔ)言
相關(guān)文章
-
構(gòu)建go鏡像實(shí)現(xiàn)過(guò)程全面講解
這篇文章主要為大家介紹了構(gòu)建go鏡像實(shí)現(xiàn)過(guò)程全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2023-12-12
-
gorm update傳入struct對(duì)象,零值字段不更新的解決方案
這篇文章主要介紹了gorm update傳入struct對(duì)象,零值字段不更新的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧 2021-04-04
-
掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開(kāi)發(fā)
這篇文章主要為大家介紹了GoLang Fiber路由和中間件進(jìn)行高效Web開(kāi)發(fā),本文將深入探討 Fiber 中的路由細(xì)節(jié),學(xué)習(xí)如何創(chuàng)建和處理路由,深入了解使用路由參數(shù)的動(dòng)態(tài)路由,并掌握在 Fiber 應(yīng)用程序中實(shí)現(xiàn)中間件的藝術(shù) 2024-01-01
-
Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器
本文主要介紹了Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2021-08-08
-
深入解析Go語(yǔ)言中crypto/subtle加密庫(kù)
本文主要介紹了深入解析Go語(yǔ)言中crypto/subtle加密庫(kù),詳細(xì)介紹crypto/subtle加密庫(kù)主要函數(shù)的用途、工作原理及實(shí)際應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下 2024-02-02
-
從零封裝Gin框架實(shí)現(xiàn)日志初始化及切割歸檔功能
這篇文章主要為大家介紹了從零封裝Gin框架實(shí)現(xiàn)日志初始化及切割歸檔功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪 2024-01-01
-
一文帶你了解Golang中reflect反射的常見(jiàn)錯(cuò)誤
go?反射的錯(cuò)誤大多數(shù)都來(lái)自于調(diào)用了一個(gè)不適合當(dāng)前類型的方法,?而且,這些錯(cuò)誤通常是在運(yùn)行時(shí)才會(huì)暴露出來(lái),而不是在編譯時(shí),如果我們傳遞的類型在反射代碼中沒(méi)有被覆蓋到那么很容易就會(huì)?panic。本文就介紹一下使用?go?反射時(shí)很大概率會(huì)出現(xiàn)的錯(cuò)誤,需要的可以參考一下 2023-01-01
最新評(píng)論
前言
有過(guò)C++語(yǔ)言學(xué)習(xí)經(jīng)歷的朋友都知道,面向?qū)ο笾饕巳齻€(gè)基本特征:封裝、繼承和多態(tài)。封裝,就是指運(yùn)行的數(shù)據(jù)和函數(shù)綁定在一起,C++中主要是通過(guò)this指針來(lái)完成的;繼承,就是指class之間可以相互繼承屬性和函數(shù);多態(tài),主要就是用統(tǒng)一的接口來(lái)處理通用的邏輯,每個(gè)class只需要按照接口實(shí)現(xiàn)自己的回調(diào)函數(shù)就可以了。
作為集大成者的Go語(yǔ)言,自然不會(huì)在面向?qū)ο笊厦鏌o(wú)所作為。相比較C++、Java、C#等面向?qū)ο笳Z(yǔ)言而言,它的面向?qū)ο蟾?jiǎn)單,也更容易理解。
go語(yǔ)言中并沒(méi)有像C++,Java語(yǔ)言中這類的Class,它只含有像C語(yǔ)言中的結(jié)構(gòu)體,用結(jié)構(gòu)體和指針等特性,完成一個(gè)類的作用,很巧妙的使用了指針和結(jié)構(gòu)體,不僅是go的面向?qū)ο?,包括go語(yǔ)言中的map等操作都是借助了結(jié)構(gòu)體。其實(shí),說(shuō)白了,C++、Java等面向?qū)ο蟮恼Z(yǔ)言中,類的底層實(shí)現(xiàn)就是結(jié)構(gòu)體,對(duì)象的引用就是指針,只是語(yǔ)言把他們封裝起來(lái)了而已。然而這使得很多人剛接觸面向?qū)ο蟮臅r(shí)候很不理解這些東西。
下面,說(shuō)所面向?qū)ο笤趃o中的寫(xiě)法:
如果我們要再Java中定義一個(gè)Rect,可以求其面積,我們應(yīng)該這么寫(xiě)
public class Rect { public int x; public int y; public int Area() { return x*y; } }
很簡(jiǎn)單,那么Go語(yǔ)言中怎么做呢?Go中并不存在所謂的類,所有的類都是用結(jié)構(gòu)體表示的,所以要寫(xiě)一個(gè)類,我們先得定義一個(gè)結(jié)構(gòu)體:
type Rect struct { x, y int }
這是一個(gè)Rect的結(jié)構(gòu)體,那么一個(gè)類中,不僅要存在變量,還要有成員函數(shù),那么go的成員函數(shù)是這么寫(xiě)的:
func (r *Rect) Area() int { return r.x*r.y }
這個(gè)成員函數(shù)的功能是求面積的,顯然,這個(gè)成員函數(shù)值對(duì)Rect的結(jié)構(gòu)體適用,這樣就實(shí)現(xiàn)了所謂的封裝,那么,我們?nèi)绾稳?chuàng)建并初始化類的實(shí)例呢
go語(yǔ)言提供了很多方式:
rect :=new(Rect) rect :=&Rect{} rect :=&Rect{1,2} rect :=&Rect{x:3,y:4}
那么,一遍情況下,如果沒(méi)有指定成員變量的大小,go語(yǔ)言會(huì)默認(rèn)初始化成員變量為0,bool
類型的為false
。
那么,構(gòu)造函數(shù)呢?
我們可以這么來(lái)寫(xiě):
func NewRect(x,y int) *Rect { return &Rect{x,y} }
其實(shí),這也是我們平時(shí)new一個(gè)對(duì)象時(shí)候的真正操作,只是go把他真正展現(xiàn)給我們了。
看到這里,我們似乎還有一個(gè)疑問(wèn),那就是,像java、C++中對(duì)于可見(jiàn)性的描述呢,go語(yǔ)言中不存在public
等關(guān)鍵字,go語(yǔ)言中直接選擇用字母大小寫(xiě)控制。
一個(gè)變量以大寫(xiě)字母開(kāi)頭則表示對(duì)其他包可見(jiàn),如果想要不可見(jiàn),那么使用小寫(xiě)字母即可,但是go語(yǔ)言中的可見(jiàn)性控制只是針對(duì)包的,并不針對(duì)類,也就是,同一個(gè)包下的類都是可見(jiàn)的。這個(gè)時(shí)候我們就可以知道了為什么輸出語(yǔ)句是這樣寫(xiě)的了吧:
fmt.Println("hello world")
因?yàn)榇撕瘮?shù)對(duì)其他包是可見(jiàn)的。
總結(jié)
以上就是GO語(yǔ)言面向?qū)ο蟮娜績(jī)?nèi)容,希望這篇文章的內(nèi)容對(duì)大家學(xué)習(xí)或者使用GO語(yǔ)言能有所幫助,如果有疑問(wèn)大家可以留言交流。
- Go語(yǔ)言基礎(chǔ)語(yǔ)法之結(jié)構(gòu)體及方法詳解
- go語(yǔ)言基礎(chǔ)語(yǔ)法示例
- Go語(yǔ)言入門教程之基礎(chǔ)語(yǔ)法快速入門
- go語(yǔ)言中的面向?qū)ο?/a>
- GO語(yǔ)言結(jié)構(gòu)體面向?qū)ο蟛僮魇纠?/a>
- GO語(yǔ)言并發(fā)編程之互斥鎖、讀寫(xiě)鎖詳解
- Go語(yǔ)言并發(fā)技術(shù)詳解
- Go語(yǔ)言如何并發(fā)超時(shí)處理詳解
- Go語(yǔ)言并發(fā)模型的2種編程方案
- go語(yǔ)言限制協(xié)程并發(fā)數(shù)的方案詳情
- Go語(yǔ)言中map使用和并發(fā)安全詳解
- 通過(guò)與Java功能上的對(duì)比來(lái)學(xué)習(xí)Go語(yǔ)言
相關(guān)文章
構(gòu)建go鏡像實(shí)現(xiàn)過(guò)程全面講解
這篇文章主要為大家介紹了構(gòu)建go鏡像實(shí)現(xiàn)過(guò)程全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12gorm update傳入struct對(duì)象,零值字段不更新的解決方案
這篇文章主要介紹了gorm update傳入struct對(duì)象,零值字段不更新的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04掌握GoLang Fiber路由和中間件技術(shù)進(jìn)行高效Web開(kāi)發(fā)
這篇文章主要為大家介紹了GoLang Fiber路由和中間件進(jìn)行高效Web開(kāi)發(fā),本文將深入探討 Fiber 中的路由細(xì)節(jié),學(xué)習(xí)如何創(chuàng)建和處理路由,深入了解使用路由參數(shù)的動(dòng)態(tài)路由,并掌握在 Fiber 應(yīng)用程序中實(shí)現(xiàn)中間件的藝術(shù)2024-01-01Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器
本文主要介紹了Go的固定時(shí)長(zhǎng)定時(shí)器和周期性時(shí)長(zhǎng)定時(shí)器,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08深入解析Go語(yǔ)言中crypto/subtle加密庫(kù)
本文主要介紹了深入解析Go語(yǔ)言中crypto/subtle加密庫(kù),詳細(xì)介紹crypto/subtle加密庫(kù)主要函數(shù)的用途、工作原理及實(shí)際應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02從零封裝Gin框架實(shí)現(xiàn)日志初始化及切割歸檔功能
這篇文章主要為大家介紹了從零封裝Gin框架實(shí)現(xiàn)日志初始化及切割歸檔功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01一文帶你了解Golang中reflect反射的常見(jiàn)錯(cuò)誤
go?反射的錯(cuò)誤大多數(shù)都來(lái)自于調(diào)用了一個(gè)不適合當(dāng)前類型的方法,?而且,這些錯(cuò)誤通常是在運(yùn)行時(shí)才會(huì)暴露出來(lái),而不是在編譯時(shí),如果我們傳遞的類型在反射代碼中沒(méi)有被覆蓋到那么很容易就會(huì)?panic。本文就介紹一下使用?go?反射時(shí)很大概率會(huì)出現(xiàn)的錯(cuò)誤,需要的可以參考一下2023-01-01