網站首頁 編程語言 正文
前言
在前面的 一文熟悉 Go 函數 文章中,介紹了 Go 函數的聲明,函數的幾種形式如匿名函數、閉包、基于函數的自定義類型和函數參數詳解等,而本文將對方法進行介紹,方法的本質就是函數,介紹方法的同時也會順帶對比其與函數的不同之處。
方法
在 Go 中,我們可以為任何的數據類型定義方法(指針或接口除外),現在讓我們看一看方法的聲明和組成部分以及與函數有什么不同之處。
type Person struct { age int } func (p *Person) SetAge(age int) error { if age < 0 { return errors.New("年齡不能小于 0 ") } p.age = age return nil }
上述代碼定義了一個結構體 Person
,此結構體包含一個 age
屬性,一個 SetAge
方法,此方法只作用于 Person
結構體。我們可以看到,該方法包含六部分,分別為:
- 1、關鍵字 聲明方法時,必須以
func
關鍵字開頭,還記得函數的聲明嗎,也是以這個關鍵字開頭。 - 2、
receiver
部分(p *Person)
這部分,在Go
中稱為receiver
部分,里面的參數稱為receiver
參數,相比于函數,方法與其的聲明區別就在于多了這一部分。 - 3、方法名。
Go
推薦使用駝峰命名的方式,和變量的命名規則一樣,首字母大寫的方法名可以在包外訪問,小寫的只能在包內訪問。 - 4、參數列表 參數列表中聲明了在方法體里所使用到的變量。參數列表位于方法名后面,用括號包裹著,多個參數使用逗號分隔開。
- 5、返回值列表 返回值為函數執行后的一個結果,上述代碼只有一個返回值,如果有多個返回值,需要用括號包裹著,返回值之間用逗號分隔開。
- 6、方法體 大括號內就是方法體,存放著方法的具體實現。
方法的調用
通過 變量.方法名(參數)
的方式對方法進行調用。例如:
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 }
創建一個 person
變量,然后調用 SetAge
函數。
Receiver 參數類型的選擇
在 Receiver
部分,我們可以綁定值類型,也可以綁定指針類型,這兩種類型什么時候使用呢?
如果方法體里不涉及到修改結構體變量的屬性值,使用值類型
type Person struct { age int } func (p Person) GetAge() int { return p.age }
對于 GetAge
方法,作用是返回年齡,沒有涉及到修改年齡的操作,因此 receiver
部分,選擇 Person
類型就可以。
如果方法體里有修改結構體變量的屬性值的操作,使用指針類型
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
涉及到對結構體屬性值修改的操作,因此 receiver
部分使用指針類型,通過指針,可以對所指向地址的變量進行修改操作。
方法的約束
Go
對方法聲明的位置是有約束的,我們不能跨越包去聲明一個類型的方法,根據這個特點我們可以發現:
不能為基本數據類型聲明方法
因為基本數據類型所定義的位置,是不在我們所編碼的包里面的。
不能跨越包為其他包的類型聲明方法
這個是 Go
的所規定的的。
小結
本文介紹了 Go 方法的聲明方式、組成部分和其與函數的不同點,同時指出Receiver
參數類型在不同場景下的選擇,最后介紹了 Go
對方法約束的體現。
原文鏈接:https://juejin.cn/post/7172208177314791455
相關推薦
- 2022-12-03 C++通信新特性協程詳細介紹_C 語言
- 2022-07-11 Python內建屬性getattribute攔截器使用詳解_python
- 2022-10-17 使用Go重試機制代碼更可靠_Golang
- 2022-07-20 如何go語言比較兩個對象是否深度相同_Golang
- 2022-11-04 解析Android?Jetpack簡介_Android
- 2022-08-10 etcd通信接口之客戶端API核心方法實戰_Golang
- 2022-01-09 出現Got permission denied while trying to connect to
- 2022-08-14 python?中的@property的用法詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支