如何在Go 中透過指標接收器方法修改簡單類型的值
在基於基本類型使用自訂類型時,您可能想要使用指標接收函數修改它們的值。但是,當您嘗試這樣做時,您可能會遇到更改似乎無效的情況。這裡有詳細的解釋:
問題
考慮以下程式碼:
package main import "fmt" type FooInt int func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp // Attempting to modify the pointer } func main() { var fi *FooInt fi.FromString("5") fmt.Println(fi) // Prints nil }
當你執行這個程式時,你會注意到儘管FromString 方法嘗試更改fi 的值,但它仍然為零。
說明
在 Go 中,所有函數參數(包括接收者)都是按值傳遞的。這表示在 FromString 方法內部,fi 指標是 main 中宣告的實際指標的副本。當您在方法中修改 fi 時,您只是修改了副本,而不是原始指標。
要解決這個問題,您有兩個選擇:
1。傳回修改後的指標
您可以從 FromString方法傳回修改後的指標並將其指派回原始指標:
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.Println(fi) // Prints the address of the modified pointer }
2.確保接收器為非零
或者,您可以在嘗試修改指向的值之前確保接收器不為零:
func (fi *FooInt) FromString(i string) { if fi == nil { fi = new(FooInt) // Initialize fi if it's nil } num, _ := strconv.Atoi(i) *fi = FooInt(num) } func main() { var fi *FooInt fi.FromString("5") fmt.Println(fi) // Prints the address of the modified pointer }
這可確保接收器為
綜上所述,在Go 中透過指標接收者方法修改值時,請記住接收者是副本,你必須傳回修改後的指標或確保接收者是非零以避免意外行為。
以上是為什麼Go中透過指標接收器方法修改簡單型別沒有達到預期效果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!