golang接口實(shí)現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解
比如有以下說明:
說明 | 備注 |
---|---|
接口 | 比如一個(gè)coder的interface,有code和debug方法 |
方法接收者(實(shí)現(xiàn)接口) | 可能有多個(gè),比如phper,golanger,可能是值接收(對象),也可能是指針接收(對象指針) |
調(diào)用者為:接口 | 就是接口coder調(diào)用 |
調(diào)用者為:方法接收者 | 比如phper,golanger,調(diào)用者可能是值調(diào)用(對象),或者指針調(diào)用(對象指針) |
關(guān)于調(diào)用
調(diào)用者為 方法接收者
無論方法接收者(實(shí)現(xiàn)接口)是值接收(對象),還是是指針接收(對象指針),都可以用調(diào)用者直接調(diào)用方法。此時(shí)調(diào)用者不受是值還是指針的限制。
換句話說:無論接收者是值類型還是指針類型,都可以通過值類型或者指針類型調(diào)用。原因是這里有尋址及解引用的隱形操作。
調(diào)用者為 接口
先說調(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)換只能使用指針,不能使用值類型。
原因:
通過值可以找到值對應(yīng)唯一的指針(無論是使用值還是使用指針,方法集都是一樣的)。
但是,實(shí)現(xiàn)接收者是指針類型的方法時(shí),接口轉(zhuǎn)換只能使用指針,不能使用值類型。這是因?yàn)橹羔樂椒ㄆ谕氖且粋€(gè)可以被取地址的對象,而通過值類型進(jìn)行接口轉(zhuǎn)換時(shí),你可能會(huì)傳遞一個(gè)無法取地址的臨時(shí)對象,這會(huì)導(dǎo)致無法調(diào)用指針方法。
關(guān)于修改
如果方法的接收者是值類型,無論調(diào)用者是對象還是對象指針,修改的都是其副本,調(diào)用者本身不會(huì)更改。
如果方法接收者是指針類型,修改的就是調(diào)用者本身。
當(dāng)你不需要修改狀態(tài)且要避免并發(fā)問題時(shí),值類型接收者是個(gè)不錯(cuò)的選擇。
當(dāng)你需要修改狀態(tài)、需要在并發(fā)環(huán)境下操作或者需要減少值拷貝時(shí),指針類型接收者更合適。
選擇接收者是值類型還是指針類型取決于多種因素,包括可修改性、并發(fā)操作和內(nèi)存開銷。
接收者是值類型的場景:
不需要修改接收者的狀態(tài):
如果方法不需要修改接收者的狀態(tài),而只是基于其屬性進(jìn)行操作,那么可以使用值類型接收者。這樣可以避免意外的副作用。
避免并發(fā)問題:
值類型接收者是線程安全的,因?yàn)樗鼈冊诜椒▋?nèi)部只操作接收者的副本,不會(huì)影響原始數(shù)據(jù)的狀態(tài)。這在并發(fā)環(huán)境中往往更容易管理。
接收者是指針類型的情況:
需要修改接收者的狀態(tài):
如果方法需要修改接收者的狀態(tài),那么你必須使用指針類型接收者。這樣可以在方法內(nèi)部修改原始數(shù)據(jù),而不僅僅是操作副本。
避免值拷貝帶來的內(nèi)存開銷:
對于大型的結(jié)構(gòu)體或?qū)ο螅褂弥羔橆愋徒邮照呖梢员苊庠诜椒ㄕ{(diào)用時(shí)進(jìn)行值的拷貝,減少內(nèi)存和性能開銷。
以上就是golang中的接口實(shí)現(xiàn)、調(diào)用、修改(值接收者、指針接收者)的詳細(xì)內(nèi)容,更多關(guān)于golang中的接口實(shí)現(xiàn)、調(diào)用、修改(值接收者、指針接收者)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺析go中的map數(shù)據(jù)結(jié)構(gòu)字典
golang中的map是一種數(shù)據(jù)類型,將鍵與值綁定到一起,底層是用哈希表實(shí)現(xiàn)的,可以快速的通過鍵找到對應(yīng)的值。這篇文章主要介紹了go中的數(shù)據(jù)結(jié)構(gòu)字典-map,需要的朋友可以參考下2019-11-11golang gin ShouldBind的介紹和使用示例詳解
在 Go 語言的 Gin 框架中,ShouldBind 是用于將請求中的數(shù)據(jù)綁定到結(jié)構(gòu)體的一個(gè)方法,它簡化了從請求中提取參數(shù)的過程,支持多種數(shù)據(jù)格式,下面給大家分享golang gin ShouldBind的介紹和使用示例,感興趣的朋友一起看看吧2024-10-10Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例
這篇文章主要為大家介紹了Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04