Golang 中的 Pointer 與 Pointer Receiver:兩個類似但本質不同的概念

更新 發佈閱讀 3 分鐘

最近在教學 Golang 的記憶體處理細節時,重新對 PointerPointer Receiver 做了梳理。這兩者經常一起出現,但實際上代表不同層面的設計。


Pointer:一種資料型別

在 Go 裡,指標(Pointer)本質上就是「儲存某個變數記憶體位置的變數」。

var a int = 10
var p *int = &a

幾個重點:

  • p 的型別是 *int,表示它指向一個 int 的位址
  • &a 是取變數 a 的位址
  • *p 是從記憶體中取出 p 指向的實際值

這種語法對 C/C++ 開發者來說應該不陌生。Go 的指標語法相對簡潔,不支援指標運算,也不能對記憶體地址做太細的操作。


Pointer Receiver:方法定義時的接收者類型

Go 的 method 語法允許你定義某個類型的方法,在定義時,receiver 可以是值,也可以是指標。

type Counter struct {
value int
}

func (c *Counter) Increment() {
c.value++
}

這裡的 (c *Counter) 表示這是一個「指標接收器」,重點有幾個:

  • 如果用值接收器(c Counter),那就是複製一份;方法裡的修改不會影響外部
  • 用指標接收器(*Counter)的話,修改會作用在原本那個實例上

Go 語言會自動幫你解參考,呼叫方法時不需要寫 (*c).Increment(),直接 c.Increment() 就行,即使 c 是實例不是指標也會自動轉換


自動幫你解參考 => 最最重要的golang特性

使用情境的判斷

如果一個方法會修改 receiver 的內容,應該使用指標接收器。如果不會修改,兩者皆可,但實務上為了一致性,通常會全部都使用 *T

這一點在標準庫中也能觀察到,例如 bytes.Buffer 的大多數方法就是用 pointer receiver,因為每次操作都會改變狀態。


這不是一個難理解的主題,但常常混淆,也容易在 struct method 設計時留下不一致的選擇。釐清概念後,實務上的判斷與維護也會更直覺。

留言
avatar-img
留言分享你的想法!
avatar-img
虎斑貓的散記
5會員
12內容數
量化研究心得,社會觀察,自我反思
你可能也想看
Thumbnail
這篇內容,將透過實戰教學,來講解「滑鼠點方塊」的程式碼。包括如何測試遊戲、座標系統、自訂參數和內建參數、if else、and、遊戲的邏輯設計、程式碼解析。
Thumbnail
這篇內容,將透過實戰教學,來講解「滑鼠點方塊」的程式碼。包括如何測試遊戲、座標系統、自訂參數和內建參數、if else、and、遊戲的邏輯設計、程式碼解析。
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
User Input & Tables 的使用
Thumbnail
User Input & Tables 的使用
Thumbnail
內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
Thumbnail
內容涵蓋資料型別、型別轉換、自訂型別、元組型別、集合型別和字典型別等主題。文章首先詳述內建型別如bool、byte、char等的定義和使用,接著討論型別轉換,包括隱含轉換和明確轉換。之後文章介紹自訂型別的建立,以及元組、集合、陣列和字典型別的操作與例子。
Thumbnail
大語言模型(如GPT-3和GPT-4)的出現改變了我們與機器互動的方式。這些模型能夠理解和生成自然語言,實現許多以前無法想像的應用。然而,你可能會好奇,這些模型究竟是如何理解語言的?這裡,我們來探討一個關鍵的概念:「一切語義都是關係」。
Thumbnail
大語言模型(如GPT-3和GPT-4)的出現改變了我們與機器互動的方式。這些模型能夠理解和生成自然語言,實現許多以前無法想像的應用。然而,你可能會好奇,這些模型究竟是如何理解語言的?這裡,我們來探討一個關鍵的概念:「一切語義都是關係」。
Thumbnail
感知器是一種基本的神經網路模型,用於二分類問題。它模擬了人腦神經元的工作原理,通過調整權重和偏差值來達到預測和分類的目的。 感知器流程 輸入 資料的輸入: 輸入層接受資料的輸入,每個輸入對應一個特徵,還有一個固定的偏差神經元。 資料經過每個神經元時,會乘上相應的
Thumbnail
感知器是一種基本的神經網路模型,用於二分類問題。它模擬了人腦神經元的工作原理,通過調整權重和偏差值來達到預測和分類的目的。 感知器流程 輸入 資料的輸入: 輸入層接受資料的輸入,每個輸入對應一個特徵,還有一個固定的偏差神經元。 資料經過每個神經元時,會乘上相應的
Thumbnail
★學習能力、策略與表徵 【知覺集中】(反義詞-去集中化) 思維方式尚未成熟,導致思維方式不合邏輯,只憑知覺所及,集中注意於事物的單一層面...
Thumbnail
★學習能力、策略與表徵 【知覺集中】(反義詞-去集中化) 思維方式尚未成熟,導致思維方式不合邏輯,只憑知覺所及,集中注意於事物的單一層面...
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News