我需要使用 3 個名為g1, g2, g3. 并以回圈方式在上述 3 個 goroutine 中分配 1-10 的數字。他們將根據提供的數字做一些假設性的作業。程式應按以下方式列印輸出。
g1-1
g2-2
g3-3
g1-4
g2-5
g3-6
...
任務必須同時執行,但輸出必須按順序排列。
我已經實作了下面的代碼,它分配數字和列印,但如上所述不能保證輸出列印順序。
我需要一些幫助來修復以下代碼或關于另一種方法的建議以獲得上述所需的輸出。
方法一:
package main
import (
"fmt"
"sync"
)
func main() {
chang1 := make(chan int)
chang2 := make(chan int)
chang3 := make(chan int)
var wg sync.WaitGroup
wg.Add(3)
go func() {
for num := range chang1 {
fmt.Println("g1", num)
}
wg.Done()
}()
go func() {
for num := range chang2 {
fmt.Println("g2", num)
}
wg.Done()
}()
go func() {
for num := range chang3 {
fmt.Println("g3", num)
}
wg.Done()
}()
channels := []chan int{chang1, chang2, chang3}
for i := 1; i <= 10; i {
currentCh := (i - 1) % 3
channels[currentCh] <- i
}
close(chang1)
close(chang2)
close(chang3)
wg.Wait()
}
輸出(順序不正確)
g1- 1
g1- 4
g2- 2
g3- 3
g1- 7
g2- 5
g2- 8
g3- 6
g3- 9
g1- 10
...
uj5u.com熱心網友回復:
如果您不想使用 slice ,那么我認為這樣的事情會起作用:-(操場)
package main
import (
"fmt"
)
func main() {
chang1 := make(chan string)
chang2 := make(chan string)
chang3 := make(chan string)
channels := []chan string{chang1, chang2, chang3}
for i := 1; i < 10; i = 3 {
go g1(i, channels[i%3])
go g2(i 1, channels[(i 1)%3])
go g3(i 2, channels[(i 2)%3])
fmt.Print(<-channels[i%3])
fmt.Print(<-channels[(i 1)%3])
fmt.Print(<-channels[(i 2)%3])
}
}
func g1(i int, chanel chan string) {
chanel <- fmt.Sprintln("g1", i)
}
func g2(i int, chanel chan string) {
chanel <- fmt.Sprintln("g2", i)
}
func g3(i int, chanel chan string) {
chanel <- fmt.Sprintln("g3", i)
}
output
g1 1
g2 2
g3 3
g1 4
g2 5
g3 6
g1 7
g2 8
g3 9
但請記住,在此解決方案中,您必須運行 3 個 goroutine,然后等待它們全部給出結果,然后回傳
如果這不適合您,則需要使用緩沖通道。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/429841.html
上一篇:如何在Go中修改位?
下一篇:從ARN中提取資源ID
