我正在嘗試使用通道和 goroutines 同時將節點添加到鏈表中。但是,我似乎做錯了什么。這是我到目前為止所寫的內容。目前,我的打印功能只是重復第 8 個節點。這似乎適用于其他鏈接列表,所以我不完全理解這個問題。任何幫助都會很棒。這是我寫的代碼func makeNodes(ctx context.Context, wg *sync.WaitGroup, ch chan Node) { defer wg.Done() for i := 0; i < 9; i++ { tmp := Node{Data: i, Next: nil} ch <- tmp } <-ctx.Done() return}type Node struct { Data int Next *Node}type List struct { Head *Node Length int Last *Node}func (l *List) addToEnd(n *Node) { if l.Head == nil { l.Head = n l.Last = n l.Length++ return } tmp := l.Last tmp.Next = n l.Last = n l.Length++}func (l List) print() { tmp := l.Head for tmp != nil { fmt.Println(tmp) tmp = tmp.Next } fmt.Println("\n")}func main() { cha := make(chan Node) defer close(cha) ctx := context.Background() ctx, cancel := context.WithCancel(ctx) var wg sync.WaitGroup wg.Add(1) list := List{nil, 0, nil} go makeNodes(ctx, &wg, cha) go func() { for j := range cha { list.addToEnd(&j) } }() cancel() wg.Wait() list.print()}
1 回答

手掌心
TA貢獻1942條經驗 獲得超3個贊
該程序分配一個結構(j在for j:= range循環中)并用從通道讀取的內容重復覆蓋它。
這導致相同的變量(j位于固定內存位置)被多次添加到列表中。
考慮將通道修改為指針通道。
在main()
cha := make(chan *Node)
然后對于makeNodes() 每次創建一個新節點(通過Node{}),一個新的節點指針被放置到通道中。
func makeNodes(ctx context.Context, wg *sync.WaitGroup, ch chan *Node) {
defer wg.Done()
for i := 0; i < 9; i++ {
tmp := Node{Data: i, Next: nil}
ch <- &tmp
}
<-ctx.Done()
return
}
下面將正確地將每個唯一的 Node 指針添加到列表中。
go func() {
for j := range cha {
list.addToEnd(j)
}
}()
此外,您可能會發現并非所有實體都會進入列表或從頻道中讀取。您用于同步生產者 ( makeNodes()) 和消費 ( for j:= range) 的方法需要改進。
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消