首頁 > 後端開發 > Golang > 為什麼 Go 的 struct setter 方法在使用值與指標接收器時表現不同?

為什麼 Go 的 struct setter 方法在使用值與指標接收器時表現不同?

Linda Hamilton
發布: 2024-12-24 20:08:17
原創
125 人瀏覽過

Why Do Go's Struct Setter Methods Behave Differently When Using Value vs. Pointer Receivers?

了解結構體類型的Setter 方法

Go 中的結構體類型提供了一種方便的方法來對相關資料進行分組,而setter 方法允許我們修改他們的財產。但是,某些情況可能會導致意外行為。

問題描述:

考慮一個帶有字段 Val 和兩個 setter 函數的結構體 T:SetVal 和 SetVal2。使用 SetVal 不會修改原始結構,而 SetVal2 會修改。理解這種差異至關重要。

底層機制:

將結構體傳遞給函數時,有兩種可能的方法:

  • 按值傳遞: 建立結構體的副本。函數內所做的任何修改僅影響副本。
  • 透過引用傳遞(指針): 提供指向原始結構的指針,允許修改保留。

推理:

SetVal 將結構體當作值 範圍。因此,在函數內建立結構體的副本,對 t(副本)的任何變更都不會影響原始 v。

解決問題:

在SetVal2中使用指標接收器方法來確保修改反映在原始版本中結構體:

func (t *T) SetVal(s string) {
    t.Val = s
}
登入後複製

驗證:

加入列印語句來示範差異:

type T struct { Val string }

func (t T) SetVal(s string) {
    fmt.Printf("Address of copy is %p\n", &t)
}

func (t *T) SetVal2(s string) {
    fmt.Printf("Pointer argument is %p\n", t)
}

func main() {
    v := T{"abc"}
    fmt.Printf("Address of v is %p\n", &v)
    v.SetVal("pdq")
    v.SetVal2("xyz")
}
登入後複製

此程式輸出:

Address of v is 0xf8400cfc00
Address of copy is 0xf8400cfcd0
Pointer argument is 0xf8400cfc00
登入後複製

v的位址和 SetVal2 中的指標相等,確認了使用原始結構,而 SetVal 適用於副本。

以上是為什麼 Go 的 struct setter 方法在使用值與指標接收器時表現不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板