Goroutine 填充结构体实例切片

这是我使用 Go 的第一天,我有一个关于 goroutines 和附加到实例切片的问题。


这个想法是每辆卡车都有一个长度为 1 的货物,其中包含一个名为“杂货”的项目。我几乎拥有它,但由于某种原因它正在失去卡车的特性,而且它似乎过早终止。


https://play.golang.org/p/f0uIy5qg8d


package main


import "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)

}


眼眸繁星
浏览 199回答 1
1回答

慕斯709654

你的问题不是卡车的属性“丢失”了,而是它们从来没有被设置在首位。这个循环是你的问题:for i, t := range trucks {&nbsp; &nbsp; t.name = fmt.Sprintf("Truck %d", i + 1)&nbsp; &nbsp; fmt.Printf("Building %s\n", t.name)}在此循环中,t是切片中Truck 对象的副本trucks。对该对象的任何修改都不会影响原始卡车。相反,您可以通过使用索引变量i直接访问trucks切片中的对象来引用原始 Truck 对象:for i, _ := range trucks {&nbsp; &nbsp; trucks[i].name = fmt.Sprintf("Truck %d", i + 1)&nbsp; &nbsp; fmt.Printf("Building %s\n", trucks[i].name)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go