首頁 >後端開發 >Golang >為什麼Go中透過指標接收器方法修改簡單型別沒有達到預期效果?

為什麼Go中透過指標接收器方法修改簡單型別沒有達到預期效果?

Patricia Arquette
Patricia Arquette原創
2024-11-16 12:29:03239瀏覽

Why Does Modifying a Simple Type Through a Pointer Receiver Method in Go Not Work as Expected?

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

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