最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

比如有以下說(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ù)的操作指南

    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ù)組的示例代碼

    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
  • 關(guān)于golang test緩存問(wèn)題

    關(guān)于golang test緩存問(wèn)題

    這篇文章主要介紹了關(guān)于golang test緩存問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Go語(yǔ)言區(qū)別于其他語(yǔ)言的特性

    Go語(yǔ)言區(qū)別于其他語(yǔ)言的特性

    在本文中,今天這篇文章將給大家介紹一下 Go 與其他語(yǔ)言不同的 9 個(gè)特性,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-10-10
  • golang進(jìn)行簡(jiǎn)單權(quán)限認(rèn)證的實(shí)現(xiàn)

    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
  • go語(yǔ)言中的Stringer的使用示例詳解

    go語(yǔ)言中的Stringer的使用示例詳解

    Go 語(yǔ)言中的 Stringer 是一個(gè)非常有用的接口,它在標(biāo)準(zhǔn)庫(kù)的 fmt 包中定義,Stringer 接口允許類型定義它們的字符串表示方式,這在格式化輸出時(shí)特別有用,這篇文章主要介紹了go語(yǔ)言中的Stringer的使用,需要的朋友可以參考下
    2025-02-02
  • golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟

    golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟

    這篇文章主要介紹了golang實(shí)現(xiàn)openssl自簽名雙向認(rèn)證的詳細(xì)步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • go?Cobra命令行工具入門教程

    go?Cobra命令行工具入門教程

    Cobra是一個(gè)用Go語(yǔ)言實(shí)現(xiàn)的命令行工具并且現(xiàn)在正在被很多項(xiàng)目使用,例如:Kubernetes、Hugo和Github?CLI等,通過(guò)使用Cobra,我們可以快速的創(chuàng)建命令行工具,特別適合寫測(cè)試腳本,各種服務(wù)的Admin?CLI等,本文重點(diǎn)給大家介紹go?Cobra命令行工具,感興趣的朋友一起看看吧
    2022-06-06
  • gorm整合進(jìn)go-zero的實(shí)現(xiàn)方法

    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
  • Golang操作命令行的幾種方式總結(jié)

    Golang操作命令行的幾種方式總結(jié)

    這篇文章主要介紹了Golang操作命令行的幾種方式總結(jié),文章通過(guò)圍主題思想展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09

最新評(píng)論

秭归县| 山阳县| 仙桃市| 洛扎县| 南丰县| 新邵县| 突泉县| 呼玛县| 关岭| 宝应县| 德兴市| 临安市| 大安市| 阜新市| 浦江县| 开远市| 泸溪县| 黄梅县| 稻城县| 沁阳市| 米脂县| 桐城市| 旺苍县| 凉山| 砚山县| 安阳县| 六盘水市| 紫金县| 都匀市| 新民市| 苏州市| 天长市| 龙山县| 郴州市| 淅川县| 扶沟县| 丰顺县| 紫云| 洛川县| 东宁县| 玉龙|