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