go語(yǔ)言沒有面向?qū)ο蟮奶匦?,也沒有類對(duì)象的概念。但是,可以使用結(jié)構(gòu)體來(lái)模擬這些特性,我們都知道面向?qū)ο罄锩嬗蓄惙椒ǖ雀拍睢N覀円部梢月暶饕恍┓椒?,屬于某個(gè)結(jié)構(gòu)體。
創(chuàng)新互聯(lián)建站主要從事成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)策勒,10余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
Go中的方法,是一種特殊的函數(shù),定義域struct之上(與struct關(guān)聯(lián)、綁定),被稱為struct的接受者(receiver)。通俗的講,方法就是有接收者的函數(shù)。
語(yǔ)法格式如下:
mytype:定義一個(gè)結(jié)構(gòu)體
recv:接受該方法的結(jié)構(gòu)體(receiver)
my_method:方法名稱
para:參數(shù)列表
return_type:返回值類型
從語(yǔ)法格式可以看出,一個(gè)方法和一個(gè)函數(shù)非常相似,多了一個(gè)接受類型。
實(shí)例
運(yùn)行結(jié)果
兩者都不算吧,go語(yǔ)言沒有明顯的傾向,可能由于語(yǔ)言的設(shè)計(jì)者都是牛人的原因,他們更傾向于讓編程者去考慮該怎么去用它。也許它的特色就是靈活吧。你可以用它實(shí)現(xiàn)面向?qū)ο?,但它本身不支持面向?qū)ο蟮恼Z(yǔ)義。
go語(yǔ)言沒有面向?qū)ο缶幊趟枷?,也沒有繼承關(guān)系,但是可以通過(guò)結(jié)構(gòu)體嵌套來(lái)實(shí)現(xiàn)這種效果。
下面通過(guò)實(shí)例演示如何實(shí)現(xiàn)結(jié)構(gòu)體嵌套,假如有一個(gè)人Person結(jié)構(gòu)體,這個(gè)人還養(yǎng)了一個(gè)寵物Dog結(jié)構(gòu)體
下面我們來(lái)看一下:
Dog結(jié)構(gòu)體
Person結(jié)構(gòu)體
訪問(wèn)它們
運(yùn)行結(jié)果
1. 保留但大幅度簡(jiǎn)化指針
Go語(yǔ)言保留著C中值和指針的區(qū)別,但是對(duì)于指針繁瑣用法進(jìn)行了大量的簡(jiǎn)化,引入引用的概念。所以在Go語(yǔ)言中,你幾乎不用擔(dān)心會(huì)因?yàn)橹苯硬僮鲀?nèi)寸而引起各式各樣的錯(cuò)誤。
2. 多參數(shù)返回
還記得在C里面為了回饋多個(gè)參數(shù),不得不開辟幾段指針傳到目標(biāo)函數(shù)中讓其操作么?在Go里面這是完全不必要的。而且多參數(shù)的支持讓Go無(wú)需使用繁瑣的exceptions體系,一個(gè)函數(shù)可以返回期待的返回值加上error,調(diào)用函數(shù)后立刻處理錯(cuò)誤信息,清晰明了。
3. Array,slice,map等內(nèi)置基本數(shù)據(jù)結(jié)構(gòu)
如果你習(xí)慣了Python中簡(jiǎn)潔的list和dict操作,在Go語(yǔ)言中,你不會(huì)感到孤單。一切都是那么熟悉,而且更加高效。如果你是C++程序員,你會(huì)發(fā)現(xiàn)你又找到了STL的vector 和 map這對(duì)朋友。
4. Interface
Go語(yǔ)言最讓人贊嘆不易的特性,就是interface的設(shè)計(jì)。任何數(shù)據(jù)結(jié)構(gòu),只要實(shí)現(xiàn)了interface所定義的函數(shù),自動(dòng)就implement了這個(gè)interface,沒有像Java那樣冗長(zhǎng)的class申明,提供了靈活太多的設(shè)計(jì)度和OO抽象度,讓你的代碼也非常干凈。千萬(wàn)不要以為你習(xí)慣了Java那種一條一條加implements的方式,感覺還行,等接口的設(shè)計(jì)越來(lái)越復(fù)雜的時(shí)候,無(wú)數(shù)Bug正在后面等著你。
同時(shí),正因?yàn)槿绱?,Go語(yǔ)言的interface可以用來(lái)表示任何generic的東西,比如一個(gè)空的interface,可以是string可以是int,可以是任何數(shù)據(jù)類型,因?yàn)檫@些數(shù)據(jù)類型都不需要實(shí)現(xiàn)任何函數(shù),自然就滿足空interface的定義了。加上Go語(yǔ)言的type assertion,可以提供一般動(dòng)態(tài)語(yǔ)言才有的duck typing特性, 而仍然能在compile中捕捉明顯的錯(cuò)誤。
5. OO
Go語(yǔ)言本質(zhì)上不是面向?qū)ο笳Z(yǔ)言,它還是過(guò)程化的。但是,在Go語(yǔ)言中, 你可以很輕易的做大部分你在別的OO語(yǔ)言中能做的事,用更簡(jiǎn)單清晰的邏輯。是的,在這里,不需要class,仍然可以繼承,仍然可以多態(tài),但是速度卻快得多。因?yàn)楸举|(zhì)上,OO在Go語(yǔ)言中,就是普通的struct操作。
6. Goroutine
這個(gè)幾乎算是Go語(yǔ)言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,這玩意是超級(jí)輕量級(jí)的類似線程的東西,但通過(guò)它,你不需要復(fù)雜的線程操作鎖操作,不需要care調(diào)度,就能玩轉(zhuǎn)基本的并行程序。在Go語(yǔ)言里,觸發(fā)一個(gè)routine和erlang spawn一樣簡(jiǎn)單?;旧弦莆誈o語(yǔ)言,以Goroutine和channel為核心的內(nèi)存模型是必須要懂的。不過(guò)請(qǐng)放心,真的非常簡(jiǎn)單。
7. 更多現(xiàn)代的特性
和C比較,Go語(yǔ)言完全就是一門現(xiàn)代化語(yǔ)言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language類似), function是first class object,等等等等。
看到這里,你可能會(huì)發(fā)現(xiàn),我用了很多輕易,簡(jiǎn)單,快速之類的形容詞來(lái)形容Go語(yǔ)言的特點(diǎn)。我想說(shuō)的是,一點(diǎn)都不夸張,連Go語(yǔ)言的入門學(xué)習(xí)到提高,都比別的語(yǔ)言門檻低太多太多。在大部分人都有C的背景的時(shí)代,對(duì)于Go語(yǔ)言,從入門到能夠上手做項(xiàng)目,最多不過(guò)半個(gè)月。Go語(yǔ)言給人的感覺就是太直接了,什么都直接,讀源代碼直接,寫自己的代碼也直接。
類的成員函數(shù) 有時(shí)也稱為 方法 。因此,方法可以認(rèn)為是傳統(tǒng)面向?qū)ο笾?類的成員函數(shù) 。不同的是,go中方法可以綁定到任何類型上,但是成員函數(shù)只能屬于類。
用來(lái)描述主調(diào)方法,就像向?qū)ο蟀l(fā)送消息。
不允許本身是指針的類型進(jìn)行方法聲明。
與繼承的不同,組合中的順序也是無(wú)意義的。
參考一等函數(shù),方法做變量
首字母大小寫,要封裝一個(gè)對(duì)象,只能通過(guò)結(jié)構(gòu)體。