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) }