继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

洋溢1310659
关注TA
已关注
手记 26
粉丝 2
获赞 4

课程名称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)的零值

图片描述
图片描述

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP