gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:40 24 4
gpt4 key购买 nike

我在管理 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 Mystruct

for {
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
}

我哪里错了?提前致谢。

最佳答案

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

这里是 a small example说明问题:

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)
}

关于go - 读入一个结构会覆盖另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52216914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com