代码如下:
package main
import (
"fmt"
"time"
)
func main() {
channelShunxu()
}
/**
通过 channel 控制实现顺序输出
*/
func channelShunxu() {
ch1 := make(chan int)
go printHello1(ch1)
go printSpace1(ch1)
go printWorld1(ch1)
go printLn1(ch1)
//这里休息一秒,否则的话,主协程直接退出了,不会等待子协程输出
time.Sleep(time.Second)
}
func printHello1(ch1 chan int) {
fmt.Print("hello")
ch1 <- 1
}
func printSpace1(ch1 chan int) {
<-ch1
fmt.Print(" ")
//<- ch1 若放在这里还是有可能出错
}
func printWorld1(ch1 chan int) {
fmt.Print("world")
ch1 <- 1
}
func printLn1(ch1 chan int) {
<-ch1
fmt.Println("")
}
我想问下能否只通过 ch1 控制这四个协程顺序的输入 hello world 吗?目前我这样写好像不行,跪求大神解答,谢谢!
经过总结各位大佬的意见以及自己的测试,最终我自己搞出了下面这种方法,请各位大佬点评!
/**
通过 channel 控制实现顺序输出
*/
func channelShunxu() {
ch1 := make(chan int, 1)
ch1 <- 1
Loop:
for {
select {
case value := <-ch1:
if value == 1 {
go printHello1(ch1)
} else if value == 2 {
go printSpace1(ch1)
} else if value == 3 {
go printWorld1(ch1)
} else if value == 4 {
go printLn1(ch1)
} else if value == 5 {
close(ch1)
break Loop
}
}
}
//这里休息一秒,否则的话,主协程直接退出了,不会等待子协程输出
time.Sleep(time.Second * 1)
}
func printHello1(ch1 chan int) {
fmt.Print("hello")
ch1 <- 2
}
func printSpace1(ch1 chan int) {
fmt.Print(" ")
ch1 <- 3
}
func printWorld1(ch1 chan int) {
fmt.Print("world")
ch1 <- 4
}
func printLn1(ch1 chan int) {
fmt.Println("")
ch1 <- 5
}
建议在通道中传输序号来判断:
具体实现看Loop函数
之所以要设置
f func()
这个参数,是确保fmt.Print打印结果不乱。