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