php中文网

Go 指针函数:为何 modifyPointer 修改了原始值,而 modifyReference 没有?

php中文网

困惑的高级指针谜题

问题:

在以下 go 代码中,两个函数都接受指针作为参数,但只有 modifypointer 成功修改了原始值。解释它们用法上的差异,并说明原因。

package main

type point struct {
    x int
    y int
}

func (p point) string() string {
    return fmt.sprintf("(%d, %d)", p.x, p.y)
}

func modifypointer(point *point) {
    point.x = 5
    point.y = 5
}

func modifyreference(point *point) {
    point = &point{5, 5}
}

func main() {
    p := point{0, 0}
    fmt.println(p) // prints (0, 0)

    modifypointer(&p)
    fmt.println(p) // prints (5, 5)

    p = point{0, 0}
    modifyreference(&p)
    fmt.println(p) // prints (0, 0) 困惑在这里,我期待的是(5, 5)
}

答案:

当函数对指针执行操作时,实际操作的不是原始值,而是指针指向的值。modifypointer 操作的是 point.x 和 point.y 的值,这些值是 p 类型的属性。point.x 和 point.y 指向 p 的存储位置,因此对它们进行修改会更新原始值。

然而,modifyreference 操作的是指针 point 本身,它将 point 重定向到一个新分配的值。由于传递给 modifyreference 的 point 是指针的副本,因此修改它不会影响外部值 p。

要使用 modifyreference 修改原始值,可以使用 point 访问指针指向的值。修改 point 的值会影响原始值,因为 *point 等于 p。

修改后的 modifyreference 代码:

func modifyReference(point *Point) {
    *point = Point{5, 5}
}

以上就是Go 指针函数:为何 modifyPointer 修改了原始值,而 modifyReference 没有?的详细内容,更多请关注php中文网其它相关文章!