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

