为何GOLANG的CHANNEL这么用要报错?

其实我就是希望获取共享变量

 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中没有数据时才会阻塞,所以加上缓存问题立刻解决