golang中,併發通道解密

案例一: make(chan int)與 make(chan int,1)區別

var c = make(chan int);
var s string;
func main() {
go va();
c fmt.Println(s);
}
func va() {
s="賦值";
}

打印結果:s被賦值了;

=======================================================

對比:

var c = make(chan int,1);
var s string;
func main() {
go va();
c fmt.Println(s);
}
func va() {
s="賦值";
}

打印說明:s暫時沒有賦值;打印結果為空

結論:make(chan int) 在c

案例二:chan安全性

var c = make(chan int,1);
var e=make(chan string);
func main() {
go va();
go va1();
for i:=0 ;i<2 ;i++ {
}
close(c)
}
func va() {
for i:=1;i<100;i++ {
c s:= fmt.Println("va=>",i,s);
}
e}
func va1() {
for i:=1;i<100;i++ {
s:= fmt.Println("va1=>",i,s);
c }
e}

打印結果:

va1=> 1 1
va=> 1 -2
va1=> 2 1
va=> 2 -2
va1=> 3 1
va=> 3 -2
va1=> 4 1
va=> 4 -2
va1=> 5 1
.
.
.
va1=> 96 1
va=> 96 -2
va1=> 97 1
va=> 97 -2
va1=> 98 1
va=> 98 -2
va1=> 99 1
va=> 99 -2

結論:chan安全,多協程操作的準備性,不會同時讀到髒數據。


分享到:


相關文章: