个人学习笔记不要看

package main

import (
	"fmt"
)

func main() {
	//构建一个通道
	ch1 := make(chan int)
	//开启一个匿名并发函数
	go func() {
		fmt.Println("start goroutine")
		//通过通道通知main的goroutine
		//这句代码会一直阻塞到main的goroutine接收为止
		ch1 <- 0
		fmt.Println("exit goroutine")
	}()
	//time.Sleep(3 * time.Second)
	fmt.Println("wait goroutine")

	//等待匿名goroutine
	<- ch1
	fmt.Println("all done")
}

并发执行,main的goroutine在发布启动协成任务后就只继续执行自己的,启动一个新的goroutine需要时间,所以先打印wait goroutine,如果main的goroutine睡眠一下就会打印start goroutine

package main

import (
	"fmt"
	"time"
)

/*
通道ch是可以进行遍历的
遍历的结果就是接收到的数据
for data := range ch{
}
通过for遍历获得的变量只有一个就是data
 */
func main() {
	//构建一个通道
	ch := make(chan int)
	//开启一个并发匿名函数
	go func() {
		fmt.Println("start goroutine")
		//从3循环到0
		for i := 3; i >= 0 ; i-- {
			//发送3到0之间的数值
			ch <- i
			//每次发送完之后等待
			time.Sleep(time.Second)
		}
		fmt.Println("exit goroutine")
	}()

	//循环接收
	for data := range ch {
		fmt.Println(data)
		//遇到数据0时,退出接收循环,如果遇到0不退出,此时通道中已经没有值的话就会触发宕机错误
		if data == 0 {
			break
		}
	}
}

并发执行,但是main的goroutine结束后,子goroutine都会结束
所以不会打印exit goroutine

posted @   蹇爱黄  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示