当前位置: 首页 > news >正文

关于Go中使用goroutine协程实现的算法

文章目录

  • select中case的使用
  • 非阻塞select
  • 有4个goroutine,按编号1、2、3、4循环打印
  • 使用三个协程,每秒钟打印cat dog fish
  • 实现两个goroutine轮流输出A 1 B 2 C 3..Z 26
  • 用N个goroutine去按顺序打印数字
  • 有一个数组,用两个协程,一个打印所有偶数的和,一个打印所有奇数的和,要用for channel机制

select中case的使用

请问以下程序的输出结果?

func case1() {
	c1 := make(chan int)
	c2 := make(chan int)
	close(c1)
	close(c2)
	select {
	case <-c1:
		fmt.Println("c1")
	case c2 <- 1:
		fmt.Println("c2")
	default:
		fmt.Println("default")
	}
}

非阻塞select

以下程序输出结果?

func case2() {
	c := make(chan int, 1)
	done := false
	for !done {
		select {
		case <-c:
			print(1)
			c = nil
		case c <- 1:
			print(2)
		default:
			print(3)
			done = true
		}
	}
}

有4个goroutine,按编号1、2、3、4循环打印

func case3() {
	ch := make([]chan int, 4)
	for i := range ch {
		ch[i] = make(chan int)
		go func(i int) {
			for {
				v := <-ch[i]
				fmt.Println(v + 1)
				time.Sleep(time.Second)
				ch[(i+1)%4] <- (v + 1) % 4
			}
		}(i)
	}
	ch[0] <- 0
	select {}
}

使用三个协程,每秒钟打印cat dog fish

func case4() {
	chCat := make(chan struct{})
	chDog := make(chan struct{})
	chFish := make(chan struct{})

	go func() {
		for {
			<-chCat
			fmt.Println("cat")
			time.Sleep(time.Second)
			chDog <- struct{}{}
		}

	}()
	go func() {
		for {
			<-chDog
			fmt.Println("dog")
			time.Sleep(time.Second)
			chFish <- struct{}{}
		}

	}()
	go func() {
		for {
			<-chFish
			fmt.Println("fish")
			time.Sleep(time.Second)
			chCat <- struct{}{}
		}

	}()
	chCat <- struct{}{}
	select {}
}

实现两个goroutine轮流输出A 1 B 2 C 3…Z 26

func case5() {
	byteCh := make(chan struct{}, 1)
	intCh := make(chan struct{}, 1)
	byteCh <- struct{}{}
	go func() {
		for {
			for i := 'A' - 0; i <= 'Z'-0; i++ {
				<-byteCh
				fmt.Println(string(i))
				intCh <- struct{}{}
			}
		}

		//return
	}()
	go func() {
		for {
			for i := 1; i <= 26; i++ {
				<-intCh
				fmt.Println(i)
				byteCh <- struct{}{}
			}
		}
		//return
	}()
	time.Sleep(time.Second)
}

用N个goroutine去按顺序打印数字

func case6() {
	const n = 5
	ch := make([]chan int, n)
	for i := 0; i < n; i++ {
		ch[i] = make(chan int, 1)
	}
	for i := 0; i < n; i++ {
		go printNum(i, ch[i])
	}
	count := 0
	for i := 0; i < 100; i++ {
		for j := 0; j < n; j++ {
			ch[j] <- count
			count++
			time.Sleep(time.Second * 1)
		}
	}
}

func printNum(gid int, ch chan int) {
	for {
		fmt.Printf("g:%d,num:%d\n", gid, <-ch)
	}
}

有一个数组,用两个协程,一个打印所有偶数的和,一个打印所有奇数的和,要用for channel机制

func case7() {
	nums := [5]int{1, 2, 32, 41, 5}
	oneCh := make(chan int, 1)
	twoCh := make(chan int, 1)
	go printOld(oneCh, nums[:])
	go printNew(twoCh, nums[:])
	fmt.Println(<-oneCh)
	fmt.Println(<-twoCh)
}

func printOld(ch chan int, arr []int) {
	sum := 0
	for _, v := range arr {
		if v%2 == 0 {
			sum += v
		}
	}
	ch <- sum
}

func printNew(ch chan int, arr []int) {
	sum := 0
	for _, v := range arr {
		if v%2 != 0 {
			sum += v
		}
	}
	ch <- sum
}

相关文章:

  • 前端面试:axios 请求的底层依赖是什么?
  • 服务器上的nginx因漏洞扫描需要升级
  • 数据结构(排序)
  • 【MySQL基础-3.2】MySQL DDL 语句详解:数据表操作篇
  • 扩展学习 | DeepSeek R1本地部署指南
  • Flutter桌面开发(三、widget布局与表单)
  • Qt的QToolButton设置弹出QMenu下拉菜单
  • 如何实现Spring Boot与Oracle数据库的完美对接?
  • 2025-03-12 学习记录--C/C++-PTA 习题8-4 报数
  • 12. Pandas :使用pandas读Excel文件的常用方法
  • WPF 制作机械手动画
  • 在线教育网站项目第三步 :通过wsl 2 安装ubuntu24.04
  • nginx中proxy_pass和root的区别
  • Flask
  • 抖音生活服务联动监管开展专项整治 济南66家违规餐饮商家下架
  • XSS跨站脚本攻击
  • ESP32芯片模组方案,设备物联网无线通信,WiFi蓝牙交互控制应用
  • Java中main函数中public static void main2(String[] args) 的String[] args是什么意思?
  • 用SpringBoot做一个web小案例实现登录
  • 宇树ROS1开源模型在ROS2中Gazebo中仿真
  • 一箭六星,朱雀二号改进型遥二运载火箭发射成功
  • 工人日报:应对“职场肥胖”,健康与减重同受关注
  • 昔日千亿房企祥生集团约2.03亿元债权被拍卖,起拍价8000万元
  • 国税总局上海市税务局通报:收到王某对刘某某及相关企业涉税问题举报,正依法依规办理
  • 泽连斯基与埃尔多安会面,称已决定派遣代表团前往伊斯坦布尔
  • 外交部:国际社会广泛理解和支持中方不同意台参加世卫大会的决定