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

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号