Go 中,指標接收器函數可讓您修改接收器物件的值。然而,理解指針在 Go 中的工作原理對於成功實現至關重要。
當嘗試透過指標接收器方法修改簡單類型的值時,可能會遇到以下情況:變更不會在方法之外持續存在。這是因為所有方法參數(包括接收者)都會在方法執行期間本地複製。
在提供的範例中:
func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp }
fi指標參數是 main 中原始 fi 指標的副本。因此,在 FromString 方法中對複製的 fi 指標所做的變更只會影響本機副本,而不影響原始指標。
要解決此問題,有幾個選項:
// Return the updated pointer and reassign it in main func (fi *FooInt) FromString(i string) *FooInt { num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp } // Reassign the updated pointer in main func main() { var fi *FooInt fi = fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }
// Pass a non-nil pointer as an argument func (fi *FooInt) FromString(i string, p **FooInt) { num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp } // Create a non-nil pointer and pass it to the method in main func main() { var fi *FooInt fi.FromString("5", &fi) fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }
// Check if the receiver is non-nil before modifying func (fi *FooInt) FromString(i string) { if fi == nil { return } num, _ := strconv.Atoi(i) *fi = FooInt(num) } // Create a non-nil receiver in main func main() { fi := new(FooInt) fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Outputs: 0xc0000b4020 5 }在修改前檢查接收者指標是否為非零。
以上是Go中如何透過指標接收方法修改值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!