golang goroutine進行通訊 channel

1.channel的讀取與聲明3d

//goroutine之間利用channel進行通訊
package main

import (
	"fmt"
	"time"
)

func readChan (c chan int) {
	//讀取通道中的內容
	a := <- c 
	fmt.Println(a)
}

func readChan2 (c chan int) {
	//讀取通道中的內容
	a := <- c 
	fmt.Println(a)
}

func main () {
	var intChan chan int 
	intChan = make(chan int, 3)

	intChan <- 3
	intChan <- 2
	intChan <- 1

	//通道和隊列同樣,先進先出
	go readChan(intChan) //3

	go readChan2(intChan) //2

	time.Sleep(time.Second * 10)
}

  channel 和隊列是同樣,先進先出的。blog

2. 帶緩衝區的通道聲明與通道阻塞隊列

//通道阻塞
package main 

import (
	"fmt"
	"time"
)

func write (c chan int) {
	for i := 0; i < 100; i++ {
		c <- i
		fmt.Printf("put data %d\n", i)
	}
}

func read (c chan int) {
	for i := 0; i < 100; i++ {
		a := <- c
		fmt.Println(a)
		time.Sleep(time.Second)
	}
}

func main () {
	//帶緩衝區的通道,這個緩衝區的大小爲10
	chan01 := make(chan int, 10)

	//只寫不讀在通道達到長度10後,通道滿了,會發送阻塞,不能在繼續寫入數據了
	go write(chan01)
	go read(chan01)

	time.Sleep(10 * time.Second)
}

  輸出結果爲it

  

3. 關閉通道 close(channel)class

  

package main 

import (
	"fmt"
)

func main () {
	chan01 := make(chan int, 10)

	for i := 0; i < 10; i++ {
		chan01 <- i
	}

	//close 關閉通道
	close(chan01)

	//這麼寫會不停輸出,由於讀取10條後,chan01已經關閉
	// for {
	// 	b := <- chan01
	// 	fmt.Println(b)
	// }

	//1.使用ok來判斷
	// for {
	// 	b, ok := <- chan01
	// 	if ok == false {
	// 		fmt.Println("chan is close")
	// 		break
	// 	}
	// 	fmt.Println(b) 
	// }

	//2使用for range 遍歷
	for v := range chan01 {
		fmt.Println(v)
	}
}

  關閉通道後,判斷有兩種方法1.參數ok來判斷;2 for ...range  判斷,通道關閉後會自動退出。import

4. channel select 的應用select

//channel select 操做
package main 

import (
	"fmt"
	"time"
)

func main () {
	chan01 := make(chan int, 10)
	chan02 := make(chan int, 10)

	for i := 0; i < 10; i++ {
		chan01 <- i
		chan02 <- i*i
	}

	for {
		select {
			case v := <- chan01:
				fmt.Println(v)
			case v := <- chan02:
				fmt.Println(v)		
			default:
				fmt.Println("time out")	
				time.Sleep(time.Second)
		}
	}

}
相關文章
相關標籤/搜索