【问题标题】:Why are changes on a copy of a struct reflecting on original struct in go?为什么结构副本上的更改会反映 go 中的原始结构?
【发布时间】:2020-04-08 12:40:23
【问题描述】:

我对 Go 中的按值传递感到困惑。我正在这样做;

package main

import (
    "fmt"
)

type point struct {
    x    int
    list []int
}

func main() {
    p := point{20, []int{1, 2, 3, 4, 5}}

    fmt.Printf("Address: %p, Value: %v\n", &p, p)
    passByValue(p, 1)
    fmt.Printf("Address: %p, Value: %v\n", &p, p)

}

func passByValue(copyOfP point, i int) {
    copyOfP.list = append(copyOfP.list[:i], copyOfP.list[i+1:]...)
    fmt.Printf("From passByValue Address: %p, Value: %v\n", &copyOfP, copyOfP)
}

输出:

Original p Address: 0xc00000c080, Value: {20 [1 2 3 4 5]}
passByValue copyOfP Address: 0xc00000c0c0, Value: {20 [1 3 4 5]}
Original p Address: 0xc00000c080, Value: {20 [1 3 4 5 5]}

copyOfP 不应该是 p 的副本,也不应该反映原来的 p 什么。

这里发生了什么?

【问题讨论】:

  • copyOfP 是 p 的副本,您的代码或输出中没有任何内容暗示与此事实相矛盾的任何内容。
  • 请参加围棋之旅并阅读有关切片的博客文章。

标签: go


【解决方案1】:
func main() {

    // history.ReadlineTest()

    p := point{20, []int{1, 2, 3, 4, 5}}

    fmt.Printf("Address: %p, Value: %v\n", &p.list[0], p)
    passByValue(p, 1)
    fmt.Printf("Address: %p, Value: %v\n", &p.list[0], p)
}

func passByValue(copyOfP point, i int) {
    copyOfP.list = append(copyOfP.list[:i], copyOfP.list[i+1:]...)
    fmt.Printf("From passByValue Address: %p, Value: %v\n", &copyOfP.list[0], copyOfP)
}
Address: 0xc00001a0c0, Value: {20 [1 2 3 4 5]}
From passByValue Address: 0xc00001a0c0, Value: {20 [1 3 4 5]}
Address: 0xc00001a0c0, Value: {20 [1 3 4 5 5]}

“列表”切片重用了相同的内存。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 2021-02-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
相关资源
最近更新 更多