亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

讀入一個結構會覆蓋另一個

讀入一個結構會覆蓋另一個

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 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號