了解結構體類型的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中文網其他相關文章!