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

Go語言的方法接受者類型用值類型還是指針類型?

 更新時間:2014年10月29日 11:44:49   投稿:junjie  
這篇文章主要介紹了Go語言的方法接受者類型用值類型還是指針類型?本文還同時講解了關(guān)于接受者的命名方式,需要的朋友可以參考下

概述

很多人(特別是新手)在寫 Go 語言代碼時經(jīng)常會問一個問題,那就是一個方法的接受者類型到底應(yīng)該是值類型還是指針類型呢,Go 的 wiki 上對這點做了很好的解釋,我來翻譯一下。

何時使用值類型

1.如果接受者是一個 map,func 或者 chan,使用值類型(因為它們本身就是引用類型)。
2.如果接受者是一個 slice,并且方法不執(zhí)行 reslice 操作,也不重新分配內(nèi)存給 slice,使用值類型。
3.如果接受者是一個小的數(shù)組或者原生的值類型結(jié)構(gòu)體類型(比如 time.Time 類型),而且沒有可修改的字段和指針,又或者接受者是一個簡單地基本類型像是 int 和 string,使用值類型就好了。

一個值類型的接受者可以減少一定數(shù)量的垃圾生成,如果一個值被傳入一個值類型接受者的方法,一個棧上的拷貝會替代在堆上分配內(nèi)存(但不是保證一定成功),所以在沒搞明白代碼想干什么之前,別因為這個原因而選擇值類型接受者。

何時使用指針類型

1.如果方法需要修改接受者,接受者必須是指針類型。
2.如果接受者是一個包含了 sync.Mutex 或者類似同步字段的結(jié)構(gòu)體,接受者必須是指針,這樣可以避免拷貝。
3.如果接受者是一個大的結(jié)構(gòu)體或者數(shù)組,那么指針類型接受者更有效率。(多大算大呢?假設(shè)把接受者的所有元素作為參數(shù)傳給方法,如果你覺得參數(shù)有點多,那么它就是大)。
4.從此方法中并發(fā)的調(diào)用函數(shù)和方法時,接受者可以被修改嗎?一個值類型的接受者當(dāng)方法調(diào)用時會創(chuàng)建一份拷貝,所以外部的修改不能作用到這個接受者上。如果修改必須被原始的接受者可見,那么接受者必須是指針類型。
5.如果接受者是一個結(jié)構(gòu)體,數(shù)組或者 slice,它們中任意一個元素是指針類型而且可能被修改,建議使用指針類型接受者,這樣會增加程序的可讀性

當(dāng)你看完這個還是有疑慮,還是不知道該使用哪種接受者,那么記住使用指針接受者。

關(guān)于接受者的命名

社區(qū)約定的接受者命名是類型的一個或兩個字母的縮寫(像 c 或者 cl 對于 Client)。不要使用泛指的名字像是 me,this 或者 self,也不要使用過度描述的名字,最后,如果你在一個地方使用了 c,那么就不要在別的地方使用 cl。

相關(guān)文章

  • 深入淺出go依賴注入工具Wire的使用

    深入淺出go依賴注入工具Wire的使用

    但隨著項目規(guī)模的增長,組件之間的依賴關(guān)系變得復(fù)雜,手動管理可能會很繁瑣,所以本文將深入探討一個備受歡迎的?Go?語言依賴注入工具——?Wire,感興趣的可以了解下
    2023-09-09
  • Go中過濾范型集合性能示例詳解

    Go中過濾范型集合性能示例詳解

    這篇文章主要為大家介紹了Go中過濾范型集合性能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Go語言pointer及switch?fallthrough實戰(zhàn)詳解

    Go語言pointer及switch?fallthrough實戰(zhàn)詳解

    這篇文章主要為大家介紹了Go語言pointer及switch?fallthrough實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 模塊一 GO語言基礎(chǔ)知識-庫源碼文件

    模塊一 GO語言基礎(chǔ)知識-庫源碼文件

    這篇文章主要介紹了模塊一 GO語言基礎(chǔ)知識-庫源碼文件,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Go語言通過WaitGroup實現(xiàn)控制并發(fā)的示例詳解

    Go語言通過WaitGroup實現(xiàn)控制并發(fā)的示例詳解

    Channel能夠很好的幫助我們控制并發(fā),但是在開發(fā)習(xí)慣上與顯示的表達不太相同,所以在Go語言中可以利用sync包中的WaitGroup實現(xiàn)并發(fā)控制,本文就來和大家詳細聊聊WaitGroup如何實現(xiàn)控制并發(fā)
    2023-01-01
  • Go語言中io包核心接口示例詳解

    Go語言中io包核心接口示例詳解

    Go的io包提供了io.Reader和io.Writer接口,分別用于數(shù)據(jù)的輸入和輸出,下面這篇文章主要給大家介紹了關(guān)于Go語言中io包核心接口的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • 一文詳解Golang使用接口支持Apply方法的配置模式

    一文詳解Golang使用接口支持Apply方法的配置模式

    這篇文章主要為大家介紹了一文詳解Golang使用接口支持Apply方法的配置模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實例探索

    Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實例探索

    這篇文章主要介紹了Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Golang并發(fā)之RWMutex的用法詳解

    Golang并發(fā)之RWMutex的用法詳解

    在?Go?語言中,RWMutex?是一種讀寫互斥鎖的實現(xiàn),它提供了一種簡單有效的方式來管理對共享資源的并發(fā)訪問。本文就來和大家詳細聊聊RWMutex的用法吧
    2023-04-04
  • 基于Golang實現(xiàn)延遲隊列(DelayQueue)

    基于Golang實現(xiàn)延遲隊列(DelayQueue)

    延遲隊列是一種特殊的隊列,元素入隊時需要指定到期時間(或延遲時間),從隊頭出隊的元素必須是已經(jīng)到期的。本文將用Golang實現(xiàn)延遲隊列,感興趣的可以了解下
    2022-09-09

最新評論