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

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

在 Go 中處理帶有引用的切片是否存在錯(cuò)誤?

在 Go 中處理帶有引用的切片是否存在錯(cuò)誤?

Go
繁星淼淼 2022-06-13 17:35:24
我正在嘗試構(gòu)建一個(gè)新的結(jié)構(gòu)列表,其中包含對另一個(gè)切片中存在的項(xiàng)目的引用。如果你看到它更容易理解,所以我準(zhǔn)備了一個(gè)你可以運(yùn)行的代碼片段。我有一個(gè)包含兩個(gè)點(diǎn)(笛卡爾坐標(biāo))的列表()dummylist,我想對其進(jìn)行解析以構(gòu)建一個(gè)新列表(mylist我定義了兩點(diǎn):{X:90.0, Y:50.0} 和 {X:20.0 , Y:30.0}。我希望 mylist 將包含 {X:90.0, Y:50.0},而不是最后有 {X:20.0, Y:30.0}。通過到處打印,我可以驗(yàn)證算法是否正常工作(它在正確的情況下進(jìn)入“if”條件),但最后,“mylist”包含錯(cuò)誤的元素。package mainimport(    "fmt")func main() {type point struct {    X float64    Y float64}type pointsList []pointtype pointContainer struct {    Point *point}type pointContainerList []pointContainer// Prepare a slice with two elementsdummylist := new(pointsList)*dummylist = append(*dummylist, point{X:90.0, Y:50.0})*dummylist = append(*dummylist, point{X:20.0 , Y:30.0})// My empty listmylist := new(pointContainerList)fmt.Println(fmt.Sprintf("---- At the beginning, mylist contains %d points", len(*mylist)))// Filter the initial list to take only elementsfor _, pt := range *dummylist {    fmt.Println("\n---- Evaluating point ", pt)    if pt.X > 80 {        fmt.Println("Appending", pt)        *mylist = append(*mylist, pointContainer{Point: &pt})        fmt.Println("Inserted point:", (*mylist)[0].Point, "len = ", len(*mylist))    }}// mylist should contain {X:90.0, Y:50.0}, instead...fmt.Println(fmt.Sprintf("\n---- At the end, mylist contains %d points", len(*mylist)))fmt.Println("Content of mylist:", (*mylist)[0].Point)}在這里你可以運(yùn)行代碼: https: //play.golang.org/p/AvrC3JJBLdT一些有用的考慮:我已經(jīng)通過多個(gè)測試看到,最后, mylist 包含循環(huán)中最后一個(gè)解析的項(xiàng)目。我覺得引用有問題。就像列表中插入的項(xiàng)目(在第一次迭代中)取決于其他迭代的“pt”。相反,如果我使用索引 (for i, pt := range *dummylist和(*dummylist)[i]),一切正常。在談?wù)?Golang 中的錯(cuò)誤之前......我錯(cuò)過了什么嗎?
查看完整描述

1 回答

?
眼眸繁星

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

是的,你錯(cuò)過了一些東西。在這條線上:

*mylist = append(*mylist, pointContainer{Point: &pt})

您將循環(huán)變量的地址&pt放入您的結(jié)構(gòu)中。隨著循環(huán)的繼續(xù),值的pt變化。(或者換句話說,&pt循環(huán)的每次迭代都將是相同的指針)。

來自go 語言規(guī)范

...

迭代值被分配給各個(gè)迭代變量,就像在賦值語句中一樣。

迭代變量可以由“范圍”子句使用短變量聲明 (:=) 的形式來聲明。在這種情況下,它們的類型被設(shè)置為各自迭代值的類型,它們的范圍是“for”語句的塊;它們在每次迭代中重復(fù)使用。如果迭代變量在“for”語句之外聲明,則在執(zhí)行后它們的值將是最后一次迭代的值。

一種解決方案是創(chuàng)建一個(gè)新值,但我不確定您從這么多指針中獲得了什么:[]point可能比指向指向points的指針結(jié)構(gòu)切片的指針更有效(并且更不容易出錯(cuò)) .


查看完整回答
反對 回復(fù) 2022-06-13
  • 1 回答
  • 0 關(guān)注
  • 138 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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