首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
清单首页golang文章详情

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)

}

下一篇
举报
领券