首頁 >後端開發 >Golang >值和指標語意如何影響 Go 中的變數修改?

值和指標語意如何影響 Go 中的變數修改?

Linda Hamilton
Linda Hamilton原創
2024-12-16 17:52:12997瀏覽

How Do Value and Pointer Semantics Affect Variable Modification in Go?

Go 中的值和指標語意

Go 遵循值語意原則,該原則規定當值傳遞給函數或方法時,建立這些值的副本。因此,對函數內的副本進行的任何變更都不會影響原始值。

此行為在以下範例中很明顯:

func main() {
    i := 1
    fmt.Println("double:", double(i))
    fmt.Println("original i:", i)
}

func double(i int) int {
    i *= 2
    return i
}

輸出:

double: 2
original i: 1

如圖所示,使用值語義修改函數內的值不會影響原始值。

相反,指標語意允許被呼叫者修改原始值,即使它是按值傳遞的。為此,必須傳遞指向原始值的指標。

func main() {
    i := 1
    fmt.Println("double:", doublep(&i))
    fmt.Println("original i:", i)
}

func doublep(i *int) int {
    *i *= 2
    return *i
}

輸出:

double: 2
original i: 2

Go 中的切片表現出指針語意。雖然切片是按值傳遞的,但它們包含指向基礎數組的指標。當切片傳遞給函數時,會建立切片頭的副本,但它會維護指向底層陣列的相同指標。因此,對函數內的切片元素所做的修改會反映在原始切片中。

func main() {
    is := []int{1, 2}
    fmt.Println("double:", doubles(is))
    fmt.Println("original is:", is)
}

func doubles(is []int) []int {
    for i := range is {
        is[i] *= 2
    }
    return is
}

輸出:

double: [2 4]
original is: [2 4]

此機制允許對函數內的切片元素進行修改要傳播到原始切片的函數。然而,數組遵循值語義,傳遞數組會創建其所有元素的副本。

以上是值和指標語意如何影響 Go 中的變數修改?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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