go使用协程计算1-100万和

方式一 channel方式

func sum(tar []int, channel chan int) int {
	result := 0
	for _, i := range tar {
		result += i
	}
	channel <- result
	return result

}

func main() {

	bT := time.Now() // 开始时间

	var (
		sign   []int
		double []int
	)
	resultChannel := make(chan int)

	for i := 1; i <= 10000; i++ {
		if i%2 == 0 {
			double = append(double, i)
		} else {
			sign = append(sign, i)
		}
		continue
	}
	go sum(sign, resultChannel)
	go sum(double, resultChannel)

	signRes, doubleRes := <-resultChannel, <-resultChannel
	log.Print("结果", signRes, doubleRes)
	log.Print("结果之和", signRes+doubleRes)
	//计算耗时
	eT := time.Since(bT)
	log.Print("耗时", eT)

}


=====控制台输出
2023/03/30 12:14:09 结果25005000 25000000
2023/03/30 12:14:09 结果之和50005000
2023/03/30 12:14:09 耗时9.2297ms

方式二 等待组


func main() {
	bT := time.Now() // 开始时间

	var (
		sign      []int
		double    []int
		wg        sync.WaitGroup
		signRes   int
		doubleRes int
	)

	for i := 1; i <= 10000; i++ {
		if i%2 == 0 {
			double = append(double, i)
		} else {
			sign = append(sign, i)
		}
		continue
	}

	wg.Add(1)
	go func(tar []int) {
		result := 0
		for _, i := range tar {
			result += i
		}
		signRes = result
		wg.Done()
	}(sign)

	wg.Add(1)

	go func(tar []int) {
		result := 0
		for _, i := range tar {
			result += i
		}
		doubleRes = result
		wg.Done()
	}(double)
	wg.Wait()

	//signRes, doubleRes
	log.Print("结果", signRes, doubleRes)
	log.Print("结果之和", signRes+doubleRes)
	//计算耗时
	eT := time.Since(bT)
	// 9.9265ms
	log.Print("耗时", eT)

}



======控制台输出
2023/03/30 12:14:58 结果25000000 25005000
2023/03/30 12:14:58 结果之和50005000
2023/03/30 12:14:58 耗时8.547ms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个需求,我们可以利用两个通道来进行协程之间的同步。一个协程负责打印数字,另一个协程负责打印字母,然后通过通道来交替控制它们的执行顺序。以下是一个示例代码: ```go package main import ( "fmt" "sync" ) func printNumbers(chNum chan bool, chAlpha chan bool, wg *sync.WaitGroup) { defer wg.Done() for i := 1; i <= 52; i += 2 { <-chNum // 等待字母协程打印完毕 fmt.Printf("%d%d", i, i+1) chAlpha <- true // 通知字母协程可以开始打印 } } func printLetters(chNum chan bool, chAlpha chan bool, wg *sync.WaitGroup) { defer wg.Done() for i := 'A'; i <= 'Z'; i++ { <-chAlpha // 等待数字协程打印完毕 fmt.Printf("%c", i) chNum <- true // 通知数字协程可以开始打印 } } func main() { chNum := make(chan bool) // 数字协程通道 chAlpha := make(chan bool) // 字母协程通道 var wg sync.WaitGroup wg.Add(2) go printNumbers(chNum, chAlpha, &wg) go printLetters(chNum, chAlpha, &wg) chNum <- true // 通知数字协程可以开始打印 wg.Wait() fmt.Println() } ``` 在这个示例代码中,我们创建了两个通道`chNum`和`chAlpha`,分别用于数字协程和字母协程之间的同步。然后使用`sync.WaitGroup`来等待协程的完成。 通过交替地在协程之间发送和接收消息,我们可以实现数字和字母的交替输出。数字协程先打印1-52中的奇数,然后等待字母协程打印完毕后再继续打印下一个数字。字母协程负责打印A-Z,然后等待数字协程打印完毕后再继续打印下一个字母。 最终的输出结果将会按照1-52和A-Z的顺序交替打印,符合题目要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值