golang學習筆記——Channel

Channel通道
  • 無緩存通道  make(chan type類型)   注意:讀和寫都是阻塞執行的
package main
 
import (
    "fmt"
    "time"
)
 
var ch = make(chan int)
 
func Printer(str string) {
    for _, data := range str {
         fmt.Printf("%c", data)
         time.Sleep(time.Second)
    }
    fmt.Printf("\n")
}
 
func Person1() {
    Printer("hello")
    ch <- 7
}
 
func Person2() {
    <-ch //通道中獲取不到數據時會阻塞等待
    Printer("world")
}
 
 
func main() {
    go Person1()
    go Person2()
 
    for {
    }
}
 
  • 有緩存通道 make(chan type類型,容量)   注意:當channel中空間未滿時是異步非阻塞
var ch = make(chan int,10)
 
  • 關閉channel  close()  注意:關閉後只能夠讀數據不能夠寫數據
package main
 
import (
    "fmt"
)
 
func main() {
    ch := make(chan int)
 
    go func() {
         for i := 0; i < 5; i++ {
                 ch <- i
         }
         close(ch)
    }()
 
    for {
         if k, ok := <-ch; ok == true { //通過 ok 判斷通道是否關閉
                 fmt.Println(k)
         } else {
                 break
         }
    }
 
    //可以使用 range 讀取通道中的數據,通道關閉後自動跳出循環
    for num := range ch {
         fmt.Println(num)
    }
 
}
 
  • 單向通道   make(chan<- type) 只寫通道    make(<-chan int) 只讀通道  注意:普通通道可以轉爲單向通道,單向不可以轉爲普通
package main
 
import (
    "fmt"
)
 
func producer(out chan<- int) {
    for i := 0; i < 5; i++ {
         out <- i * i
    }
    close(out)
}
 
func consumer(in <-chan int) {
    for num := range in {
         fmt.Println(num)
    }
}
 
func main() {
    ch := make(chan int)
 
    go producer(ch)
 
    consumer(ch)
}
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章