區塊鏈技術語言(二十三)——Go語言面向物件:方法
封裝是面向物件三大特性之一。封裝的好處,一個是增加程式碼內聚性,就是將資料和對資料的操作封裝在一起,提高可複用性和可維護性;還有就是資訊隱藏,就是把不該暴露的資訊藏起來,通過訪問控制來隱藏資料,不被外界干擾。也就是說,一個物件就是一個封裝了資料和操作這些資料的程式碼的邏輯實體。
Go語言沒有封裝這個名詞,但它通過方法實現了封裝的特性。
1
Go語言方法
方法,本質上是一個函式。與普通函式的格式有一點不同,它在關鍵字 func 和方法名中間加入了一個特殊的接收器型別。其格式如下:
注:a. 接收者t的名字自定義,它可以被方法的內部內容訪問;
b. 型別擁有的所有方法名都必須是唯一的,但不同的型別可以使用相同的方法名;
c. 建立在Type型別的方法,讓Type型別的資料和對此資料進行的程式碼操作捆綁在一起,實現了封裝。
1.1 結構體型別的接收者與基本型別的接收者
接收者既可以是結構體型別,也可以是基本型別。
接收者型別為結構體型別,定義的結構體和定義在結構體上的方法同屬一個main包,所以方法可以直接繫結到結構體型別的接收者上。但是Go語言的基本型別位於builtin包,定義於main包的方法不能直接繫結在基礎型別的接收者,所以必須先對基本型別宣告類型別名。
1.1.1 結構體型別接收者
接收者可以被方法內部內容訪問,當接收者型別為結構體型別時,方法內部也可以訪問結構體的成員變數,訪問格式為:
方法的呼叫格式為:
注:“變數名.方法名”被稱為選擇器。
1.1.2 基本型別接收者
在使用方法之前先對基本型別宣告類型別名,再使用方法。方法的呼叫格式為:
注:“變數名.方法名”被稱為選擇器。
1.2 值型別的接收者與指標型別的接收者
接收者是值型別:方法呼叫時,不論傳入的物件是值型別還是指標型別,接收器都會將它們轉化為值型別,在方法內部對值型別接收者進行改變,對該變數沒有任何影響;
接收者是指標型別:方法呼叫時,不論傳入的物件是值型別還是指標型別,接收器都會將它們轉化為指標型別,在方法內部對指標型別接收者進行改變,對該變數有影響。
2
方法和函式的區別
在Go語言裡,方法本質上是函式,但它與普通函式還有點不同,如表1所示。
2.1 方法和函式在傳入物件方面的區別
2.1.1 接收者為值型別的方法和引數為值型別的函式的區別
函式引數為值型別,它只能接收值型別的實參;
方法的接收者為值型別,它既可以接收值型別的傳入物件,也可以接收指標型別的傳入物件。
2.1.2 接收者為指標型別的方法和引數為指標型別的函式的區別
函式引數為指標型別,它只能接收指標型別的實參;
方法的接收者為指標型別,它既可以接收值型別的傳入物件,也可以接收指標型別的傳入物件。
2.2 多個方法和多個函式在是否可以同名方面的區別
接收者型別不同,方法名可以相同,即相同名字的方法可以定義在不同的型別上。但是一個程式不能有兩個相同名字的函式。
3
方法值和方法表示式
方法的呼叫除了“物件變數名.方法名(引數)”這種形式以外,還有另外兩種表現形式:方法值和方法表示式。
3.1 方法值
方法呼叫的一種表現形式是方法值,即選擇器作為一個值賦值給一個變數。此時這個變數是一個函式型別變數,它把方法繫結到接收者。函式只需提供實參而不需要提供接收者就能夠呼叫。
3.2 方法表示式
方法呼叫的另一種形式是方法表示式,如表2所示。
注:a.引用的方法表示式被還原成為普通函式樣式,將此表示式賦值給一個變數,呼叫時接收者是第一個引數,必須顯式傳參。
b. 若方法接收器型別是值型別:當方法表示式中的型別是值型別T,方法表示式呼叫 時,接收者也必須是值型別p;當方法表示式中的型別是指標型別(*T),方法表示式呼叫時,接收者也必須是指標&p;
c. 若方法接收器型別是指標型別:方法表示式中的型別只能是指標型別(*T),方法表示式呼叫時,接收者必須是指標&p。
4
方法的延遲呼叫
defer不僅限於函式的呼叫,也可以用於方法的延遲呼叫。

ofollow,noindex"> 原文連結:區塊鏈技術語言(二十三)——Go語言面向物件
參考資料
[1] 許式偉,呂桂華.Go語言程式設計[M].北京:人民郵電出版社,2012:62-67.
[2] 譚浩強.C++面向物件程式設計[M]. 清華大學出版社,2006
[3] 陳維興,陳昕.C++面向物件程式設計[M]. 人民郵電出版社,2010
本文完,獲取更多資訊,敬請關注區塊鏈工程師。
來源:鏈塊學院
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”