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

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

标签:
Go

课程名称GO开发工程师

课程章节:6-1:channel

课程讲师ccmouse

课程内容

创建channel:

func chanDemoDeadlock() {
	//var c chan int 声明一个channel
	c := make(chan int) // 创建一个channel
	c <- 1              // 往channel里写数据
	c <- 2
	n := <-c       // 从channel里读数据
	fmt.Println(n) // fatal error: all goroutines are asleep - deadlock!

	//	deadlock的原因:往channel里写数据时没人接收
}

通过协程接收channel里的数据

func chanDemoGoRoutine() {
	//var c chan int 声明一个channel
	c := make(chan int) // 创建一个channel
	go func() {         // 创建协程去接收channel里数据
		for { // 持续接收
			n := <-c
			fmt.Println(n)
		}

	}()
	c <- 1 // 往channel里写数据
	c <- 2

	//	运行结果有可能只打印了1
	//	原因:往channel里发2后主程序就结束了,协程还来不及打印
}

打印顺序:

func worker(i int, c chan int) {
	for {
		// printf 是io操作,输出的顺序不确定(会被调度器调度)
		fmt.Printf("i: %d---> n: %c\n", i, <-c)
	}
	//i: 4---> n: e
	//i: 5---> n: f
	//i: 8---> n: i
	//i: 6---> n: g
	//i: 7---> n: h
	//i: 1---> n: b
	//i: 9---> n: j
	//i: 0---> n: a
	//i: 2---> n: c
}
func chanDemoWorker() {
	var channels [10]chan int
	for i := 0; i < len(channels); i++ {
		go worker(i, channels[i]) // 将匿名函数提取为子函数
	}
	for i := 0; i < 10; i++ {
		channels[i] <- 'a' + i
	}
	for i := 0; i < 10; i++ {
		channels[i] <- 'A' + i
	}
	time.Sleep(time.Minute) // 延迟主程序main退出
}

提取工作子函数:

func createWorker(i int) chan int {
	c := make(chan int)
	go func() {
		for {
			fmt.Printf("i: %d---> n: %c\n", i, <-c)
		}
	}()
	return c
}
func chanDemoCreateWorker() {
	var channels [10]chan int
	for i := 0; i < len(channels); i++ {
		channels[i] = createWorker(i) // 将匿名函数提取为子函数
	}
	for i := 0; i < 10; i++ {
		channels[i] <- 'a' + i
	}
	for i := 0; i < 10; i++ {
		channels[i] <- 'A' + i
	}
	time.Sleep(time.Minute) // 延迟主程序main退出
}

课程收获

  1. 注意channel 类型的写法 chan int

图片描述
图片描述

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消