就是这题用来理解 goroutine 很不错,同时是大厂面试喜欢问的,毕竟这题不难,但重在你是否真的理解了,理解了就好记忆一点
但是记忆除了理解还有很多方法,今天就让你既理解,又记忆长久
或者字母数字什么啦,都一样,重在交替而已,别的只是一点点条件不同
接下来我会说两种,一种有缓冲,一种没缓冲,看懂一种,另一种都非常好理解和记忆了
现在呢,咱们别看代码,先想一下怎么写
实现同步,同步的方式
func main() {
supersedeChannel()
}
func supersedeChannel() {
// 两个 goroutine 交替打印法,两个chan
chanOne := make(chan int, 1)
chanTwo := make(chan int, 1)
wg := sync.WaitGroup{}
wg.Add(2)
chanOne <- 1
go func() {
defer wg.Done()
for i := 1; i <= 100; i += 2 {
<-chanOne
fmt.Printf("%v,", i)
chanTwo <- i
}
}()
go func() {
defer wg.Done()
for i := 2; i <= 100; i += 2 {
<-chanTwo
fmt.Printf("%v,", i)
chanOne <- i
}
}()
fmt.Println("嗯嗯嗯嗯嗯嗯嗯嗯呢")
//time.Sleep(1 * time.Second) // 为什么加了这一行就能打印出来,不加这一行就打印不出来
wg.Wait()
fmt.Println("哈哈哈哈哈哈哈哈")
}
有缓冲懂了,这个无缓冲,那还不手到擒来
func main() {
supersedeChannel()
}
func supersedeChannel() {
// 两个 goroutine 交替打印法,使用 channel 同步
chanOne := make(chan bool)
chanTwo := make(chan bool)
done := make(chan bool)
go func() {
defer close(done)
for i := 1; i <= 100; i += 2 {
<-chanOne
fmt.Printf("%v,", i)
chanTwo <- true
}
}()
go func() {
//defer close(chanOne)
defer close(chanTwo)
for i := 2; i <= 100; i += 2 {
<-chanTwo
fmt.Printf("%v,", i)
chanOne <- true
}
}()
fmt.Println("enennenenennenenene")
chanOne <- true // 启动交替打印的循环
<-done
fmt.Println("\n哈哈哈哈哈哈哈哈")
}