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中文网其他相关文章!