为了账号安全,请及时绑定邮箱和手机立即绑定

读入一个结构会覆盖另一个

读入一个结构会覆盖另一个

Go
慕斯709654 2023-03-29 17:24:31
我在管理 Go 中的结构时遇到了一些问题。我有复杂的结构和两个基于该结构的变量——“previous”和“current”。我正在尝试从 tarfile 中读取数据,进行一些计算并将以前的替换为当前的。但是在我读到当前的下一次阅读迭代中,在我看来,“先前”的内容被覆盖并且两个变量变得相同。结构定义如下:type Mystruct struct {    Data       [][]sql.NullString    Rnames     []string    Nsize      int    Msize      int    Namemaxlen map[string]int    Valid      bool    Err        error}变量不是指针。复制作为直接赋值执行:以前的=当前的。tr := tar.NewReader(f)var prev, curr Mystructfor {    hdr, err := tr.Next()    if err == io.EOF {        break    } else if err != nil {        log.Panicln(err)    }    data := make([]byte, hdr.Size)    if _, err := io.ReadFull(tr, data); err != nil {        log.Panicln(err)    }    if err = json.Unmarshal(data, &curr); err != nil {        log.Panicln(err)    }    if prev.Valid != true {        prev = curr        continue    }    // other computations here    prev = curr}我哪里错了?提前致谢。
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

问题是您的结构包含切片,这些切片基本上是指向内存的指针。复制这些指针意味着您的副本指向与原始内存相同的内存,因此它们共享切片值。改变一个就会改变另一个。

这是一个小例子来说明这个问题:

package main


import "fmt"


type s struct {

    a     int

    slice []int

}


func main() {

    // create the original thing

    prev := s{

        a:     5,

        slice: []int{1, 2, 3},

    }

    // copy the thing into cur

    cur := prev

    // now change cur, changing a will change only cur.a because integers are

    // really copied

    cur.a = 6

    // changing the copied slice will actually change the original as well 

    // because copying a slice basically copies the pointer to memory and the

    // copy points to the same underlying memory area as the original

    cur.slice[0] = 999

    // printing both, we can see that the int a was changed only in the copy but

    // the slice has changed in both variables, because it references the same

    // memory

    fmt.Println(prev)

    fmt.Println(cur)

}


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信