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

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

Goroutine 填充結構體實例切片

Goroutine 填充結構體實例切片

Go
眼眸繁星 2021-11-29 19:41:26
這是我使用 Go 的第一天,我有一個關于 goroutines 和附加到實例切片的問題。這個想法是每輛卡車都有一個長度為 1 的貨物,其中包含一個名為“雜貨”的項目。我幾乎擁有它,但由于某種原因它正在失去卡車的特性,而且它似乎過早終止。https://play.golang.org/p/f0uIy5qg8dpackage mainimport "fmt"import "time"type Item struct {   name string}type Truck struct{   Cargo []Item   name  string}func UnloadTrucks(ch chan *Truck){    t := <- ch    fmt.Printf("%s has %d items in cargo: %s\n", t.name, len(t.Cargo), t.Cargo[0].name)    time.Sleep(1 * time.Second)    return }func main() {     trucks := make([]Truck, 2)     ch := make(chan *Truck)     for i, t := range trucks{         t.name = fmt.Sprintf("Truck %d", i + 1)     fmt.Printf("Building %s\n", t.name)     }     for _, t := range trucks {            go func(tr *Truck){          itm := Item {}                  itm.name = "Groceries"                  fmt.Printf("Loading %s", tr.name)                  tr.Cargo = append(tr.Cargo, itm)                  ch <- tr            }(&t)     }     UnloadTrucks(ch)}
查看完整描述

1 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

你的問題不是卡車的屬性“丟失”了,而是它們從來沒有被設置在首位。這個循環是你的問題:


for i, t := range trucks {

    t.name = fmt.Sprintf("Truck %d", i + 1)

    fmt.Printf("Building %s\n", t.name)

}

在此循環中,t是切片中Truck 對象的副本trucks。對該對象的任何修改都不會影響原始卡車。相反,您可以通過使用索引變量i直接訪問trucks切片中的對象來引用原始 Truck 對象:


for i, _ := range trucks {

    trucks[i].name = fmt.Sprintf("Truck %d", i + 1)

    fmt.Printf("Building %s\n", trucks[i].name)

}


查看完整回答
反對 回復 2021-11-29
  • 1 回答
  • 0 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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