用于填充结构实例切片的 Goroutine
Goroutine to populate struct instance slice
这是我第一天使用 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)
}
您的问题不是卡车的属性 "lost",而是它们从来没有在一开始就被设置。这个循环是你的问题:
for i, t := range trucks {
t.name = fmt.Sprintf("Truck %d", i + 1)
fmt.Printf("Building %s\n", t.name)
}
在此循环中,t
是 trucks
切片中 Truck 对象的 副本。对此对象的任何修改都不会影响原始卡车。相反,您可以通过使用索引变量 i
直接访问 trucks
切片中的对象来引用原始 Truck 对象:
for i, _ := range trucks {
trucks[i].name = fmt.Sprintf("Truck %d", i + 1)
fmt.Printf("Building %s\n", trucks[i].name)
}
这是我第一天使用 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)
}
您的问题不是卡车的属性 "lost",而是它们从来没有在一开始就被设置。这个循环是你的问题:
for i, t := range trucks {
t.name = fmt.Sprintf("Truck %d", i + 1)
fmt.Printf("Building %s\n", t.name)
}
在此循环中,t
是 trucks
切片中 Truck 对象的 副本。对此对象的任何修改都不会影响原始卡车。相反,您可以通过使用索引变量 i
直接访问 trucks
切片中的对象来引用原始 Truck 对象:
for i, _ := range trucks {
trucks[i].name = fmt.Sprintf("Truck %d", i + 1)
fmt.Printf("Building %s\n", trucks[i].name)
}