Goroutine填充结构实例切片

时间:2015-12-29 17:55:13

标签: go goroutine

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

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

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)
}

1 个答案:

答案 0 :(得分:1)

你的问题不是卡车的属性“丢失”,而是从来没有设置过。这个循环是你的问题:

for i, t := range trucks {
    t.name = fmt.Sprintf("Truck %d", i + 1)
    fmt.Printf("Building %s\n", t.name)
}

在此循环中,ttrucks切片中Truck对象的副本。对此物体的任何修改都不会影响原始卡车。相反,您可以使用索引变量i来引用原始Truck对象,以直接访问trucks切片中的对象:

for i, _ := range trucks {
    trucks[i].name = fmt.Sprintf("Truck %d", i + 1)
    fmt.Printf("Building %s\n", trucks[i].name)
}