Go中运用chan的简单案例

汉斯-冯-拉特 ·
我测试了下是 是先进先出,这个案例之所以打印结果是c1:2 c2:1,是因为f2函数被先执行,f1函数在后面执行,代码直观上会给我们一个错觉是f1函数先执行,f2函数后执行,因为f1函数在前面 贴上代码,运行时就会发现是先进先出 package main import ( "fmt" "time" ) func main() { c := make(chan int, 2) go f1(c) time.Sleep(10 * 1000000) go f2(c) time.Sleep(10 * 1000000) c1 := <- c fmt.Println("c1: ", c1) c2 := <- c fmt.Println("c2: ", c2) } func f1(c chan int) { fmt.Println("f1 b") c <- 1 fmt.Println("f1 e") } func f2(c chan int) { fmt.Println("f2 b") c <- 2 fmt.Println("f2 e") }
#2
更多评论
因为 c:=make(chan int 2) 有缓冲区的存在<br> go f1(c)<br> go f2(c)<br> 所以缓冲了(1,2)<br> 然后 <br> c1 := <-c<br> c2 := <-c<br> 这里想请教下缓冲区的规则是**先进后出** 吗?<br> 不然就就应该是c1=1 c2=2 了<br>
#1
不,其实是随机的,因为go的多线程是并发,由系统随机选择某一个线程进行执行。 func main() { fmt.Println("good boy") fmt.Println("bad ass") c := make(chan int ,4) go fun1(c) go fun2(c) go fun3(c) go fun2(c) c1 := <- c c2 := <- c c3 := <- c c4 := <- c fmt.Println(c1,c2,c3,c4) } 这个函数中,fun1、fun2、fun3分别给c传入1,2,3,执行三次的打印结果为 2 1 3 2 2 3 2 1 1 2 2 3 可见并不是完全相同
#3