为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第10天 go语言channel下

标签:
Go

课程名称GO开发工程师

课程章节:6-1:channel

课程讲师ccmouse

课程内容

  1. 约束channel只写只读:
// chan<- int: 只能往chan里写数据
// <-chan int: 只能从chan里读数据
func createWorkerSpecChan(i int) chan<- int {
	c := make(chan int)
	go func() {
		for {
			fmt.Printf("i: %d---> n: %c\n", i, <-c)
		}
	}()
	return c
}
  1. channel缓冲区
func buffered() {
	c := make(chan int, 3) // 建立缓冲区,可以不必没发一次数据就必须开一个协程去消费
	go worker(0, c)
	c <- '1'
	c <- '2'
	c <- '3'                // 可以发3个数据
	time.Sleep(time.Minute) // 延迟主程序main退出
}
  1. 关闭channel
func channelClose() {
	c := make(chan int)
	go worker(0, c)
	c <- '1'
	c <- '2'
	c <- '3'
	close(c)                // 关闭channel,告诉接收方已经发送完毕
	time.Sleep(time.Minute) // 延迟主程序main退出
}
  1. 监测channel退出的方式
func worker(i int, c chan int) {
	//方式一: 手动判断,跳出
	for {
		n, ok := <-c
		if !ok { // 如果接收失败(channel关闭),跳出循环
			break
		}
		// printf 是io操作,输出的顺序不确定(会被调度器调度)
		fmt.Printf("i: %d---> n: %c\n", i, n)
	}

	// 方式二: for range
	for n := range c { //
		fmt.Printf("i: %d---> n: %c\n", i, n) // channel关闭后自动跳出
	}
	// 如果channel关闭,c打印出来的值永远是 chan int的零值
}

课程收获

  1. go语言channel的设计初衷:通过通信来共享内存。
    传统的语言是通过共享内存来通信。
  2. 何为共享内存:
    比如: 通过共享一个标志变量flag,当flag为true时其它人就知道当前任务已完成。
  3. 如果channel关闭,接收者仍然从channel里去读数据,那么获取到的值永远是channel 类型(int时为0)的零值

图片描述
图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消