go語言進階?channel管道Channel是Go中的一個核心類型,你可以把它看成一個管道,通過它并發核心單元就可以發送或者接收數據進行通訊(communication),下面我們就來說一說關于go語言進階?我們一起去了解并探讨一下這個問題吧!
go語言進階
channel管道
Channel是Go中的一個核心類型,你可以把它看成一個管道,通過它并發核心單元就可以發送或者接收數據進行通訊(communication)。
它的操作符是箭頭 <-
創建channel
msg := make(chan string 3)
數據寫入channel
msg <- "你好"
msg <- "在嗎"
讀取channel
message := <-msg
fmt.Println(message)
fmt.Println(<-msg)
讀取結果:你好 在嗎
channel 結合gorouting
package main
import (
"fmt"
"time"
)
func main() {
msg := make(chan int, 3)
go test(msg)
//寫入數據
for i := 0; i < 10; i {
msg <- i
fmt.Println("寫入數據", i)
time.Sleep(time.Second * 1)
}
}
func test(m chan int) {
for {
//不停的讀取
fmt.Println("讀取數據", <-m)
}
}
運行結果:
寫入數據 0
讀取數據 0
寫入數據 1
讀取數據 1
寫入數據 2
讀取數據 2
寫入數據 3
讀取數據 3
寫入數據 4
讀取數據 4
寫入數據 5
讀取數據 5
寫入數據 6
讀取數據 6
寫入數據 7
讀取數據 7
寫入數據 8
讀取數據 8
寫入數據 9
讀取數據 9
這裡需要注意一下make(chan int, 3) 這個語法意思是管道中有三個緩存int空間,當這個緩存賽滿了,就需要阻塞,等待另一個線程取出數據後再寫入。
channel的關閉
close(管道名)
package main
import (
"fmt"
"time"
)
func main() {
msg := make(chan int, 3)
go test(msg)
//寫入數據
for i := 0; i < 10; i {
msg <- i
fmt.Println("寫入數據", i)
time.Sleep(time.Second * 1)
}
close(msg) //關閉管道
}
func test(m chan int) {
for {
//不停的讀取
data, ok := <-m
if ok == true {
fmt.Println("讀取數據", data)
} else {
break
}
}
}
channel和range
range可以更方便的讀取管道中的數據
把上面的test方法修改一下
func test(m chan int) {
for i := range m {
fmt.Println("讀取數據:", i)
}
}
channel 和select
如果有同時多個case去處理,比如同時有多個channel可以接收數據,那麼Go會僞随機的選擇一個case處理(pseudo-random)。如果沒有case需要處理,則會選擇default去處理,如果default case存在的情況下。如果沒有default case,則select語句會阻塞,直到某個case需要處理。
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}