欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang接口實(shí)現(xiàn)調(diào)用修改(值接收者指針接收者)場景詳解

 更新時(shí)間:2023年08月23日 14:05:24   作者:牙小木木  
這篇文章主要為大家介紹了golang接口實(shí)現(xiàn)調(diào)用修改值接收者指針接收者示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

比如有以下說明:

說明備注
接口比如一個(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?reflect反射慢的原因

    深入理解go?reflect反射慢的原因

    我們選擇?go?語言的一個(gè)重要原因是,它有非常高的性能。但是它反射的性能卻一直為人所詬病,本篇文章就來看看?go?反射的性能問題,感興趣的可以了解一下
    2023-01-01
  • 淺析go中的map數(shù)據(jù)結(jié)構(gòu)字典

    淺析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-11
  • 一文帶你搞懂Golang如何正確退出Goroutine

    一文帶你搞懂Golang如何正確退出Goroutine

    在Go語言中,Goroutine是一種輕量級(jí)線程,它的退出機(jī)制對于并發(fā)編程至關(guān)重要,下午就來介紹幾種Goroutine的退出機(jī)制,希望對大家有所幫助
    2023-06-06
  • golang gin ShouldBind的介紹和使用示例詳解

    golang gin ShouldBind的介紹和使用示例詳解

    在 Go 語言的 Gin 框架中,ShouldBind 是用于將請求中的數(shù)據(jù)綁定到結(jié)構(gòu)體的一個(gè)方法,它簡化了從請求中提取參數(shù)的過程,支持多種數(shù)據(jù)格式,下面給大家分享golang gin ShouldBind的介紹和使用示例,感興趣的朋友一起看看吧
    2024-10-10
  • Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例

    Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例

    這篇文章主要為大家介紹了Beego中ORM操作各類數(shù)據(jù)庫連接方式詳細(xì)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go語言中的Array、Slice、Map和Set使用詳解

    Go語言中的Array、Slice、Map和Set使用詳解

    這篇文章主要介紹了Go語言中的Array、Slice、Map和Set使用詳解,本文給出了它們的創(chuàng)建、使用、多維等代碼實(shí)例,需要的朋友可以參考下
    2014-10-10
  • golang中的空slice案例

    golang中的空slice案例

    這篇文章主要介紹了golang中的空slice案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 一文掌握Golang模糊測試

    一文掌握Golang模糊測試

    本文主要介紹了一文掌握Golang模糊測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Golang超全面講解并發(fā)

    Golang超全面講解并發(fā)

    goroutine?不是os線程、不是綠色線程(由語言運(yùn)行時(shí)管理的線程),是協(xié)程。協(xié)程是一種非搶占式的簡單并發(fā)子goroutine(函數(shù)、閉包或方法),也就是說,它們不能被中斷。取而代之的是,協(xié)程有多個(gè)點(diǎn),允許暫?;蛑匦逻M(jìn)入?—Go語言并發(fā)之道
    2022-06-06
  • Go語言文件操作的方法

    Go語言文件操作的方法

    這篇文章主要介紹了Go語言文件操作的方法,涉及文件的讀寫及關(guān)閉等操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評論