golang接口實(shí)現(xiàn)調(diào)用修改(值接收者指針接收者)場(chǎng)景詳解
比如有以下說(shuō)明:
| 說(shuō)明 | 備注 |
|---|---|
| 接口 | 比如一個(gè)coder的interface,有code和debug方法 |
| 方法接收者(實(shí)現(xiàn)接口) | 可能有多個(gè),比如phper,golanger,可能是值接收(對(duì)象),也可能是指針接收(對(duì)象指針) |
| 調(diào)用者為:接口 | 就是接口coder調(diào)用 |
| 調(diào)用者為:方法接收者 | 比如phper,golanger,調(diào)用者可能是值調(diào)用(對(duì)象),或者指針調(diào)用(對(duì)象指針) |
關(guān)于調(diào)用
調(diào)用者為 方法接收者
無(wú)論方法接收者(實(shí)現(xiàn)接口)是值接收(對(duì)象),還是是指針接收(對(duì)象指針),都可以用調(diào)用者直接調(diào)用方法。此時(shí)調(diào)用者不受是值還是指針的限制。
換句話說(shuō):無(wú)論接收者是值類型還是指針類型,都可以通過(guò)值類型或者指針類型調(diào)用。原因是這里有尋址及解引用的隱形操作。
調(diào)用者為 接口
先說(shuō)調(diào)用者為接口的意思是:
type Coder interface {
code()
debug()
}
func Work(c Coder){
c.code()
c.debug()
}
type Golang struct {
}
type PHP struct {
}
func (g *Golang) code(){
fmt.Println("golang code")
}
func (g *Golang) debug(){
fmt.Println("golang debug")
}
func (g *PHP) code(){
fmt.Println("php code")
}
func (g PHP) debug(){
fmt.Println("php debug")
}
//這里理解為調(diào)用者為接口,
var c Coder=&PHP{}
c.debug()
c.code()這里主要涉及到接口轉(zhuǎn)換,及需要把coder轉(zhuǎn)為phper或者golanger
結(jié)論:實(shí)現(xiàn)接收者是值類型的接口方法時(shí),可以正常地用值或指針進(jìn)行接口轉(zhuǎn)換,
但實(shí)現(xiàn)接收者是指針類型的方法時(shí),接口轉(zhuǎn)換只能使用指針,不能使用值類型。
原因:
通過(guò)值可以找到值對(duì)應(yīng)唯一的指針(無(wú)論是使用值還是使用指針,方法集都是一樣的)。
但是,實(shí)現(xiàn)接收者是指針類型的方法時(shí),接口轉(zhuǎn)換只能使用指針,不能使用值類型。這是因?yàn)橹羔樂(lè)椒ㄆ谕氖且粋€(gè)可以被取地址的對(duì)象,而通過(guò)值類型進(jìn)行接口轉(zhuǎn)換時(shí),你可能會(huì)傳遞一個(gè)無(wú)法取地址的臨時(shí)對(duì)象,這會(huì)導(dǎo)致無(wú)法調(diào)用指針?lè)椒ā?/p>
關(guān)于修改
如果方法的接收者是值類型,無(wú)論調(diào)用者是對(duì)象還是對(duì)象指針,修改的都是其副本,調(diào)用者本身不會(huì)更改。
如果方法接收者是指針類型,修改的就是調(diào)用者本身。
當(dāng)你不需要修改狀態(tài)且要避免并發(fā)問(wèn)題時(shí),值類型接收者是個(gè)不錯(cuò)的選擇。
當(dāng)你需要修改狀態(tài)、需要在并發(fā)環(huán)境下操作或者需要減少值拷貝時(shí),指針類型接收者更合適。
選擇接收者是值類型還是指針類型取決于多種因素,包括可修改性、并發(fā)操作和內(nèi)存開(kāi)銷。
接收者是值類型的場(chǎng)景:
不需要修改接收者的狀態(tài):
如果方法不需要修改接收者的狀態(tài),而只是基于其屬性進(jìn)行操作,那么可以使用值類型接收者。這樣可以避免意外的副作用。
避免并發(fā)問(wèn)題:
值類型接收者是線程安全的,因?yàn)樗鼈冊(cè)诜椒▋?nèi)部只操作接收者的副本,不會(huì)影響原始數(shù)據(jù)的狀態(tài)。這在并發(fā)環(huán)境中往往更容易管理。
接收者是指針類型的情況:
需要修改接收者的狀態(tài):
如果方法需要修改接收者的狀態(tài),那么你必須使用指針類型接收者。這樣可以在方法內(nèi)部修改原始數(shù)據(jù),而不僅僅是操作副本。
避免值拷貝帶來(lái)的內(nèi)存開(kāi)銷:
對(duì)于大型的結(jié)構(gòu)體或?qū)ο?,使用指針類型接收者可以避免在方法調(diào)用時(shí)進(jìn)行值的拷貝,減少內(nèi)存和性能開(kāi)銷。
以上就是golang中的接口實(shí)現(xiàn)、調(diào)用、修改(值接收者、指針接收者)的詳細(xì)內(nèi)容,更多關(guān)于golang中的接口實(shí)現(xiàn)、調(diào)用、修改(值接收者、指針接收者)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang?Template實(shí)現(xiàn)自定義函數(shù)的操作指南
這篇文章主要為大家詳細(xì)介紹了Golang如何利用Template實(shí)現(xiàn)自定義函數(shù)的操作,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
Go語(yǔ)言轉(zhuǎn)化php數(shù)組的示例代碼
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言如何實(shí)現(xiàn)轉(zhuǎn)化php數(shù)組的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入學(xué)習(xí)GO語(yǔ)言有一定的幫助,需要的可以參考下2023-11-11
golang進(jìn)行簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn)
本文主要介紹了golang簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟
這篇文章主要介紹了golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03
gorm整合進(jìn)go-zero的實(shí)現(xiàn)方法
go-zero提供的代碼生成器里面,沒(méi)有提供orm框架操作,但是提供了遍歷的緩存操作,所以可以利用gorm當(dāng)作一個(gè)sql語(yǔ)句的生成器,把生成后的sql語(yǔ)句放到go-zero生成的模板中去執(zhí)行,對(duì)gorm整合進(jìn)go-zero的實(shí)現(xiàn)方法感興趣的朋友一起看看吧2022-03-03

