第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

讀入一個結(jié)構(gòu)會覆蓋另一個

讀入一個結(jié)構(gòu)會覆蓋另一個

Go
慕斯709654 2023-03-29 17:24:31
我在管理 Go 中的結(jié)構(gòu)時遇到了一些問題。我有復(fù)雜的結(jié)構(gòu)和兩個基于該結(jié)構(gòu)的變量——“previous”和“current”。我正在嘗試從 tarfile 中讀取數(shù)據(jù),進(jìn)行一些計算并將以前的替換為當(dāng)前的。但是在我讀到當(dāng)前的下一次閱讀迭代中,在我看來,“先前”的內(nèi)容被覆蓋并且兩個變量變得相同。結(jié)構(gòu)定義如下:type Mystruct struct {    Data       [][]sql.NullString    Rnames     []string    Nsize      int    Msize      int    Namemaxlen map[string]int    Valid      bool    Err        error}變量不是指針。復(fù)制作為直接賦值執(zhí)行:以前的=當(dāng)前的。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 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗 獲得超9個贊

問題是您的結(jié)構(gòu)包含切片,這些切片基本上是指向內(nèi)存的指針。復(fù)制這些指針意味著您的副本指向與原始內(nèi)存相同的內(nèi)存,因此它們共享切片值。改變一個就會改變另一個。

這是一個小例子來說明這個問題:

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)

}


查看完整回答
反對 回復(fù) 2023-03-29
  • 1 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號