首頁 >後端開發 >Golang >Go中如何透過指標接收方法修改值?

Go中如何透過指標接收方法修改值?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-14 21:52:021016瀏覽

How to Modify Values Through Pointer Receiver Methods in Go?

Go 中的指標接收器方法和值修改

Go 中,指標接收器函數可讓您修改接收器物件的值。然而,理解指針在 Go 中的工作原理對於成功實現至關重要。

問題解決

當嘗試透過指標接收器方法修改簡單類型的值時,可能會遇到以下情況:變更不會在方法之外持續存在。這是因為所有方法參數(包括接收者)都會在方法執行期間本地複製。

方法參數複製

在提供的範例中:

func (fi *FooInt) FromString(i string) {
    num, _ := strconv.Atoi(i)
    tmp := FooInt(num)
    fi = &tmp
}

fi指標參數是 main 中原始 fi 指標的副本。因此,在 FromString 方法中對複製的 fi 指標所做的變更只會影響本機副本,而不影響原始指標。

解決方案

要解決此問題,有幾個選項:

  1. 返回更新後的指針:
返回更新後的指針:

// 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
}
    建立回傳語句,將更新後的指標指派給接收者,然後在main 中重新指派傳回的指標。
傳遞非零指標:

// 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn