其实我就是希望获取共享变量
package main
import (
"fmt"
//"time"
)
var ch chan bool
var lock chan bool
var msg string
func main() {
ch = make(chan bool)
lock = make(chan bool)
msg = ""
for i := 0; i < 10; i++ {
go bingfa(i)
}
for j := 0; j < 10; j++ {
<-ch
}
fmt.Println("-------------")
}
func bingfa(i int) {
lock <- true
msg = fmt.Sprint(msg, "-", i)
fmt.Println(msg)
<-lock
ch <- true
}
具体错误是什么,是不是你的chan是无缓冲,会死锁
ch = make(chan boo, 1l)
lock = make(chan bool, 1)
lock的信道需要加一个缓冲,不然会导致bingfa死锁。
然后这个程序打印的输出也是不确定的。因为不同参数i的bingfa运行顺序是不定的。你可以使用一个公共的变量用于计数。这样的输出是确定的。
package main
import (
"fmt"
//"time"
)
var ch chan bool
var lock chan bool
var msg string
var num int
func main() {
ch = make(chan bool)
lock = make(chan bool, 1)
msg = ""
num = 0
for i := 0; i < 10; i++ {
go bingfa(i)
}
for j := 0; j < 10; j++ {
<-ch
}
fmt.Println("-------------")
}
func bingfa(i int) {
lock <- true
msg = fmt.Sprint(msg, "-", num)
num = num + 1
fmt.Println(msg)
<-lock
ch <- true
}
输出:
-0
-0-1
-0-1-2
-0-1-2-3
-0-1-2-3-4
-0-1-2-3-4-5
-0-1-2-3-4-5-6
-0-1-2-3-4-5-6-7
-0-1-2-3-4-5-6-7-8
-0-1-2-3-4-5-6-7-8-9
无缓存通道阻塞机制导致的,在往chan放置时要保证·同时·(重点)有程序准备接收chan数据。你的问题出在lock <- true 这个位置死锁了,因此,如果用无缓存通道你的程序逻辑错了
而有缓存通道机制是chan中没有数据时才会阻塞,所以加上缓存问题立刻解决