一文帶你了解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 excelize讀取excel進(jìn)行時(shí)間類型轉(zhuǎn)換的示例代碼(自動(dòng)轉(zhuǎn)換)
我們經(jīng)常會(huì)遇到如何自動(dòng)識(shí)別excel中的時(shí)間類型數(shù)據(jù)并轉(zhuǎn)化成對(duì)應(yīng)的 "Y-m-d H:i:s"類型數(shù)據(jù),本文小編給大家介紹了GO excelize讀取excel進(jìn)行時(shí)間類型轉(zhuǎn)換的示例代碼(自動(dòng)轉(zhuǎn)換),需要的朋友可以參考下2024-10-10
解析Go 標(biāo)準(zhǔn)庫(kù) http.FileServer 實(shí)現(xiàn)靜態(tài)文件服務(wù)
http.FileServer 方法屬于標(biāo)準(zhǔn)庫(kù) net/http,返回一個(gè)使用 FileSystem 接口 root 提供文件訪問(wèn)服務(wù)的 HTTP 處理器。下面通過(guò)本文給大家介紹Go 標(biāo)準(zhǔn)庫(kù) http.FileServer 實(shí)現(xiàn)靜態(tài)文件服務(wù)的相關(guān)知識(shí),感興趣的朋友一起看看吧2018-08-08
詳解如何在Go中循環(huán)中使用Defer關(guān)鍵字示例詳解
這篇文章主要為大家介紹了詳解如何在Go中循環(huán)中使用Defer關(guān)鍵字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
總結(jié)Go語(yǔ)言中defer的使用和注意要點(diǎn)
Go語(yǔ)言中的defer關(guān)鍵字實(shí)現(xiàn)比較特殊的功能,這篇文章給大家總結(jié)了關(guān)于Go語(yǔ)言中defer的使用和注意要點(diǎn),有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-09-09
golang hack插件開發(fā)動(dòng)態(tài)鏈接庫(kù)實(shí)例探究
這篇文章主要為大家介紹了golang hack插件開發(fā)動(dòng)態(tài)鏈接庫(kù)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼
這篇文章主要介紹了golang 生成二維碼海報(bào)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
go?REST?API設(shè)計(jì)模式和反模式示例解析
在這篇文章中,我們將探討一些常見(jiàn)的REST?API設(shè)計(jì)模式和開發(fā)者應(yīng)該注意的反模式,我們還將提供Golang和Open?API?Schema的代碼片段來(lái)幫助說(shuō)明這些概念,有需要的朋友可以借鑒參考下2023-09-09

