在 Go 中,方法中的指標接收器可讓您修改結構體的原始值。但是,這不適用於簡單類型。這個問題深入探討了為什麼此類修改不起作用並提出了解決方案。
考慮以下程式碼:
package main import ( "fmt" "strconv" ) type FooInt int func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp } func main() { var fi *FooInt fi.FromString("5") fmt.Printf("%v\n", fi) // Prints <nil> }
在這裡,您期望函數 FromString將 fi 的值設為 5。但它印出
在 Go 中,函數/方法參數(包括接收者)是原始值的副本。因此,函數內的修改只會影響副本。
即使對於指針,接收者也是原始指針的副本,而不是實際的指針本身。因此,對接收者的值進行的修改不會影響原始指標。
要解決此問題,有幾個選項:
傳回修改後的內容指標:
func (fi *FooInt) FromString(i string) *FooInt { num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp } func main() { var fi *FooInt fi = fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
func (fi *FooInt) FromString(i string, p **FooInt) { num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp } func main() { var fi *FooInt fi.FromString("5", &fi) fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) *fi = FooInt(num) } func main() { fi := new(FooInt) // Initialize to non-nil fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
以上是為什麼我不能在 Go 中使用指標接收器修改簡單類型的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!