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

关于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
}

http://www.kler.cn/a/582147.html

相关文章:

  • java的字符串,数组,集合的长度/大小
  • 格雷希尔: G80P系列在制动卡钳行业自动化应用
  • 数据结构--【顺序表与链表】笔记
  • 第42天:WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写权限操作
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_02带边框和斑马纹的固定表头表格
  • 【从零开始学习计算机科学】操作系统(四)进程的死锁
  • DeepSeek R1在医学领域的应用与技术分析(Discuss V1版)
  • Html5学习教程,从入门到精通, HTML5 新的 Input 类型:语法知识点与案例代码(16)
  • Git创建仓库和基本命令
  • 图纸的安全怎么管理?
  • Android 粘包与丢包处理工具类:支持多种粘包策略的 Helper 实现
  • 沉浸式CSS学习路径
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-7.3.2使用GraphQL封装查询接口
  • C++数组,链表,二叉树的内存排列是什么样的,结构体占多大内存如何计算,类占多大内存如何计算,空类的空间是多少,为什么?
  • Kotlin学习笔记之类与对象
  • 云创智城 ×YunParking停车源码+YunCharge充电源码+DeepSeek:AI 驱动城市级停车平台升级,构建安全智慧出行新生态
  • 【赵渝强老师】管理MongoDB的运行
  • c语言程序设计---(动态内存分配)考研复试面试问答
  • QEMU构建基于ubuntu的根文件系统
  • vue知识点(2)