一文帶你了解Go語(yǔ)言中方法的調(diào)用
前言
在前面的 一文熟悉 Go 函數(shù) 文章中,介紹了 Go 函數(shù)的聲明,函數(shù)的幾種形式如匿名函數(shù)、閉包、基于函數(shù)的自定義類(lèi)型和函數(shù)參數(shù)詳解等,而本文將對(duì)方法進(jìn)行介紹,方法的本質(zhì)就是函數(shù),介紹方法的同時(shí)也會(huì)順帶對(duì)比其與函數(shù)的不同之處。
方法
在 Go 中,我們可以為任何的數(shù)據(jù)類(lèi)型定義方法(指針或接口除外),現(xiàn)在讓我們看一看方法的聲明和組成部分以及與函數(shù)有什么不同之處。
type Person struct { age int } func (p *Person) SetAge(age int) error { if age < 0 { return errors.New("年齡不能小于 0 ") } p.age = age return nil }
上述代碼定義了一個(gè)結(jié)構(gòu)體 Person
,此結(jié)構(gòu)體包含一個(gè) age
屬性,一個(gè) SetAge
方法,此方法只作用于 Person
結(jié)構(gòu)體。我們可以看到,該方法包含六部分,分別為:
- 1、關(guān)鍵字 聲明方法時(shí),必須以
func
關(guān)鍵字開(kāi)頭,還記得函數(shù)的聲明嗎,也是以這個(gè)關(guān)鍵字開(kāi)頭。 - 2、
receiver
部分(p *Person)
這部分,在Go
中稱(chēng)為receiver
部分,里面的參數(shù)稱(chēng)為receiver
參數(shù),相比于函數(shù),方法與其的聲明區(qū)別就在于多了這一部分。 - 3、方法名。
Go
推薦使用駝峰命名的方式,和變量的命名規(guī)則一樣,首字母大寫(xiě)的方法名可以在包外訪問(wèn),小寫(xiě)的只能在包內(nèi)訪問(wèn)。 - 4、參數(shù)列表 參數(shù)列表中聲明了在方法體里所使用到的變量。參數(shù)列表位于方法名后面,用括號(hào)包裹著,多個(gè)參數(shù)使用逗號(hào)分隔開(kāi)。
- 5、返回值列表 返回值為函數(shù)執(zhí)行后的一個(gè)結(jié)果,上述代碼只有一個(gè)返回值,如果有多個(gè)返回值,需要用括號(hào)包裹著,返回值之間用逗號(hào)分隔開(kāi)。
- 6、方法體 大括號(hào)內(nèi)就是方法體,存放著方法的具體實(shí)現(xiàn)。
方法的調(diào)用
通過(guò) 變量.方法名(參數(shù))
的方式對(duì)方法進(jìn)行調(diào)用。例如:
import ( "errors" "fmt" ) type Person struct { age int } func (p *Person) SetAge(age int) error { if age < 0 { return errors.New("年齡不能小于 0 ") } p.age = age return nil } func main() { person := Person{} err := person.SetAge(18) if err != nil { return } fmt.Println(person.age) // 18 }
創(chuàng)建一個(gè) person
變量,然后調(diào)用 SetAge
函數(shù)。
Receiver 參數(shù)類(lèi)型的選擇
在 Receiver
部分,我們可以綁定值類(lèi)型,也可以綁定指針類(lèi)型,這兩種類(lèi)型什么時(shí)候使用呢?
如果方法體里不涉及到修改結(jié)構(gòu)體變量的屬性值,使用值類(lèi)型
type Person struct { age int } func (p Person) GetAge() int { return p.age }
對(duì)于 GetAge
方法,作用是返回年齡,沒(méi)有涉及到修改年齡的操作,因此 receiver
部分,選擇 Person
類(lèi)型就可以。
如果方法體里有修改結(jié)構(gòu)體變量的屬性值的操作,使用指針類(lèi)型
type Person struct { age int } func (p *Person) SetAge(age int) error { if age < 0 { return errors.New("年齡不能小于 0 ") } p.age = age return nil }
SetAge
涉及到對(duì)結(jié)構(gòu)體屬性值修改的操作,因此 receiver
部分使用指針類(lèi)型,通過(guò)指針,可以對(duì)所指向地址的變量進(jìn)行修改操作。
方法的約束
Go
對(duì)方法聲明的位置是有約束的,我們不能跨越包去聲明一個(gè)類(lèi)型的方法,根據(jù)這個(gè)特點(diǎn)我們可以發(fā)現(xiàn):
不能為基本數(shù)據(jù)類(lèi)型聲明方法
因?yàn)榛緮?shù)據(jù)類(lèi)型所定義的位置,是不在我們所編碼的包里面的。
不能跨越包為其他包的類(lèi)型聲明方法
這個(gè)是 Go
的所規(guī)定的的。
小結(jié)
本文介紹了 Go 方法的聲明方式、組成部分和其與函數(shù)的不同點(diǎn),同時(shí)指出Receiver
參數(shù)類(lèi)型在不同場(chǎng)景下的選擇,最后介紹了 Go
對(duì)方法約束的體現(xiàn)。
到此這篇關(guān)于一文帶你了解Go語(yǔ)言中方法的調(diào)用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go 代碼規(guī)范錯(cuò)誤處理示例經(jīng)驗(yàn)總結(jié)
這篇文章主要為大家介紹了Go 代碼規(guī)范錯(cuò)誤處理示例實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Go語(yǔ)言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)設(shè)計(jì)模式之策略模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析
這篇文章主要為大家介紹了go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Go語(yǔ)言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)之網(wǎng)絡(luò)編程全面教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Go語(yǔ)言單元測(cè)試基礎(chǔ)從入門(mén)到放棄
這篇文章主要介紹了Go單元測(cè)試基礎(chǔ)從入門(mén)到放棄為大家開(kāi)啟Go語(yǔ)言單元測(cè)試第一篇章,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06