先贴代码
代码1
func main() {
fmt.Println("---start chantest3")
chanA := make(chan int)
chanC := make(chan string)
go chanHandleA(chanA)
fmt.Println("---before chanHandleA<-testVal", time.Now())
testVal := 3
chanA <- testVal
fmt.Println("---after chanHandleA<-testVal", time.Now())
fmt.Println("")
go chanHandleC(chanC)
fmt.Println("---before chanHandleC<-testVal2", time.Now())
testVal2 := "55"
chanC <- testVal2
fmt.Println("---after chanHandleC<-testVal2", time.Now())
}
func chanHandleA(c chan int) {
fmt.Println("[chanHandleA] reading", time.Now())
num := <-c
fmt.Println("[chanHandleA] read2", time.Now())
c <- num * num
}
func chanHandleC(c chan string) {
fmt.Println("[chanHandleC] reading", time.Now())
str := <-c
fmt.Println("[chanHandleC] read2", time.Now())
c <- str + "a"
}
执行结果1
---start chantest3
---before chanHandleA<-testVal 2023-12-13 22:18:07.8027533 +0800 CST m=+0.002027001
[chanHandleA] reading 2023-12-13 22:18:07.8027533 +0800 CST m=+0.002027001
[chanHandleA] read2 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
---after chanHandleA<-testVal 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
---before chanHandleC<-testVal2 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
[chanHandleC] reading 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
[chanHandleC] read2 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
---after chanHandleC<-testVal2 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
代码2(只是将 go chanHandleC(chanC) 紧随 go chanHandleA(chanA) 后面)
func main() {
fmt.Println("---start chantest3")
chanA := make(chan int)
chanC := make(chan string)
go chanHandleA(chanA)
go chanHandleC(chanC)
fmt.Println("---before chanHandleA<-testVal", time.Now())
testVal := 3
chanA <- testVal
fmt.Println("---after chanHandleA<-testVal", time.Now())
fmt.Println("")
fmt.Println("---before chanHandleC<-testVal2", time.Now())
testVal2 := "55"
chanC <- testVal2
fmt.Println("---after chanHandleC<-testVal2", time.Now())
}
func chanHandleA(c chan int) {
fmt.Println("[chanHandleA] reading", time.Now())
num := <-c
fmt.Println("[chanHandleA] read2", time.Now())
c <- num * num
}
func chanHandleC(c chan string) {
fmt.Println("[chanHandleC] reading", time.Now())
str := <-c
fmt.Println("[chanHandleC] read2", time.Now())
c <- str + "a"
}
执行结果2
---start chantest3
---before chanHandleA<-testVal 2023-12-13 22:09:24.8118001 +0800 CST m=+0.002073501
[chanHandleA] reading 2023-12-13118001 +0800 CST m=+0.002073501
[chanHandleA] read2 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501 22:09:24.8
---after chanHandleA<-testVal 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501
---before chanHandleC<-testVal2 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501
[chanHandleC] reading 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501
[chanHandleC] read2 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501
---after chanHandleC<-testVal2 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501
num := <-c 和 str := <-c 执行后,后面的代码都会被阻塞。
为什么代码1中[chanHandleA] read2和[chanHandleC] read2还能输出?
代码2 [chanHandleA] read2能输出而[chanHandleC] read2不能输出?