我需要使用名为g1,g2,g3的三个大猩猩。并以循环的方式将数字从1到10分发到上述3只猩猩中。他们将根据所提供的数字进行一些假设性工作。程序应以下列方式打印输出。
g1-1
g2-2
g3-3
g1-4
g2-5
g3-6
..。
任务必须同时执行,但输出必须按顺序顺序进行。
我已经实现了下面的代码,它分配数字和打印,但输出打印顺序没有保证如上所述。
我需要一些帮助来修复下面的代码或关于另一种方法的建议,以获得上述期望的输出。
方法1:
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
..。
发布于 2022-02-17 13:41:12
如果您不想使用片,那么我想这样的东西会起作用的:- (游乐场)
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个goroutines,然后等待所有它们都给出结果,然后返回
如果这不适合您,您需要使用缓冲区通道。
https://stackoverflow.com/questions/71158069
复制相似问题