golang goroutine、channel和select

goroutine

package main

import "fmt"
import "time"

func printn(id int){
	for i := 0;i<10;i++ {
		fmt.Println(id,":",i)
	}
}


func main(){
	for i :=0;i<5;i++ {
		go printn(i)
	}
	fmt.Println("waiting...")
	time.Sleep(time.Second * 3)
}
//執行結果:
waiting...
0 : 0
2 : 0
0 : 1
2 : 1
0 : 2
1 : 0
2 : 2
0 : 3
2 : 3
1 : 1
0 : 4
2 : 4
0 : 5
1 : 2
2 : 5
0 : 6
1 : 3
2 : 6
0 : 7
1 : 4
2 : 7
1 : 5
3 : 0
3 : 1
3 : 2
2 : 8
1 : 6
2 : 9
1 : 7
3 : 3
0 : 8
0 : 9
1 : 8
3 : 4
3 : 5
3 : 6
3 : 7
3 : 8
3 : 9
1 : 9
4 : 0
4 : 1
4 : 2
4 : 3
4 : 4
4 : 5
4 : 6
4 : 7
4 : 8
4 : 9


// 如果把sleep去掉會怎麼樣?
package main

import "fmt"
//import "time"

func printn(id int){
	for i := 0;i<10;i++ {
		fmt.Println(id,":",i)
	}
}


func main(){
	for i :=0;i<5;i++ {
		go printn(i)
	}
	fmt.Println("waiting...")
	//time.Sleep(time.Second * 3)
}
// 執行結果:
waiting...            //原因是沒有sleep,當main函數執行完會中斷其他所有沒執行完的任務

2、channel

package main

import "fmt"
//import "time"

func printn(id int,c chan int){
	for i := 0;i<10;i++ {
		fmt.Println(id,":",i)
	}
	c <- 0      //將數值存到 c
}


func main(){
	c :=make(chan int)   // 創建一個channel 
	go printn(1,c)
//	for i :=0;i<5;i++ {
//		go printn(i)
//	}
	fmt.Println("waiting...")
	//time.Sleep(time.Second * 3)
	<- c        // 取出c得值
}
// 執行結果:
waiting...
1 : 0
1 : 1
1 : 2
1 : 3
1 : 4
1 : 5
1 : 6
1 : 7
1 : 8
1 : 9

3、select 

package main

import "fmt"
import "time"

func fun1(c chan string){
	for {
		c <- "from fun1 +"
		time.Sleep(time.Second * 2)
	}
}

func fun2(c chan string){
        for {
                c <- "from fun2 -"
                time.Sleep(time.Second * 2)
        }
}




func main(){
	c1 :=make(chan string)
	c2 :=make(chan string)
	go fun1(c1)
	go fun2(c2)
	for {
	select {           
		case msg1 := <- c1:
			fmt.Println(msg1)
		case msg2 := <- c2:
                        fmt.Println(msg2)

	}
	}

}
// 執行結果:

from fun2 -
from fun1 +
from fun2 -
from fun1 +
from fun1 +
from fun2 -
from fun2 -
from fun1 +
from fun1 +
from fun2 -
...........


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章