首页 > 其他分享 >Golang使用Goroutine实现筛素数

Golang使用Goroutine实现筛素数

时间:2024-03-06 21:24:49浏览次数:36  
标签:ch package int Goroutine chan Golang 素数 func main

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.package main
package main

import "fmt"

// Send the sequence 2, 3, 4, ... to channel 'ch'.
func generate(ch chan int) {
    for i := 2; ; i++ {
        ch <- i // Send 'i' to channel 'ch'.
    }
}

// Copy the values from channel 'in' to channel 'out',
// removing those divisible by 'prime'.
func filter(in, out chan int, prime int) {
    for {
        i := <-in // Receive value of new variable 'i' from 'in'.
        if i%prime != 0 {
            out <- i // Send 'i' to channel 'out'.
        }
    }
}

// The prime sieve: Daisy-chain filter processes together.
func main() {
    ch := make(chan int) // Create a new channel.
    go generate(ch)      // Start generate() as a goroutine.
    for {
        prime := <-ch
        fmt.Print(prime, " ")
        ch1 := make(chan int)
        go filter(ch, ch1, prime)
        ch = ch1
    }
}

 

方法二

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
    "fmt"
)

// Send the sequence 2, 3, 4, ... to returned channel
func generate() chan int {
    ch := make(chan int)
    go func() {
        for i := 2; ; i++ {
            ch <- i
        }
    }()
    return ch
}

// Filter out input values divisible by 'prime', send rest to returned channel
func filter(in chan int, prime int) chan int {
    out := make(chan int)
    go func() {
        for {
            if i := <-in; i%prime != 0 {
                out <- i
            }
        }
    }()
    return out
}

func sieve() chan int {
    out := make(chan int)
    go func() {
        ch := generate()
        for {
            prime := <-ch
            ch = filter(ch, prime)
            out <- prime
        }
    }()
    return out
}

func main() {
    primes := sieve()
    for {
        fmt.Println(<-primes)
    }
}

 

标签:ch,package,int,Goroutine,chan,Golang,素数,func,main
From: https://www.cnblogs.com/luci990722/p/18057609

相关文章

  • golang进阶之接口
    目录一、接口二、为什么要使用接口三、接口的定义四、实现接口的条件五、接口类型的变量1.值接收者实现接口2.指针类型接收者实现接口3.接口进阶示例六、同一个类型实现多个接口七、多个类型实现同一个接口八、类型中的嵌套去实现接口九、接口嵌套十、空接口1.空接口的定义2.......
  • Golang(Go语言)字符串转时间格式封装以及填坑
    先看代码:packagemainimport( "fmt" "time")funcmain(){ timeStr:="2021-05-2100:00:00" utcTime,_:=time.Parse(time.DateTime,timeStr) fmt.Println(utcTime)fmt.Println(utcTime.Local())}执行结果:从这里可以看出,字符串转换为时......
  • 应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控
    作者:古琦在现代软件架构中,微服务已成为构建可扩展和灵活应用程序的流行方式。每个微服务负责应用程序的一部分功能,它们共同工作以提供完整的服务。由于微服务架构的分散特性,监控变得至关重要,有效的微服务监控是确保高可用性、可靠性和服务质量的关键组成部分,它支撑了整个系统的健......
  • golang标准库之 fmt
    目录fmt库1.获取输入(1)fmt.Scan(常用)(2)fmt.Scanln(常用)(3)fmt.Scanf2.print、println、printf输出3.Sprint(了解即可)4.Errorf(了解即可)5.格式化占位符(1)通用占位符(2)布尔型占位符(3)整型占位符(4)浮点数与复数占位符(5)字符串和[]byte占位符(6)指针占位符(7)宽度标识符(8)其他fmt库fmt包实现了......
  • golang标准库之 flag、strconv
    目录一、flag库1.flag的简单替代2.flag的参数类型3.flag参数的定义(1)flag.Type()(2)flag.TypeVar()4.flag解析命令行参数5.flag其他方法二、strconv库1.string转换为int类型2.int转换为string类型3.Parse系列函数(1)ParseBool()(2)ParseInt()(3)ParseUnit()(4)ParseFloat()(5)示例4.Fo......
  • golang标准库之 time
    目录time库1.时间类型2.时间戳(1)时间格式转化为时间戳(2)时间戳转换为时间格式3.时间间隔类型4.时间的操作(1)时间格式化(2)解析字符串类型的时间(3)时间加时间间隔(4)两个时间之差(5)时间是否相同(6)判断时间前后(7)定时器time库time库是Go语言内置的库,用来定义和操作时间、日期time.Sl......
  • golang进阶之结构体
    目录一、结构体(Go的面向对象)1.结构体的含义2.type关键字(1)自定义新类型(2)类型的别名(3)自定义类型和类型别名的区别二、结构体的定义三、结构体实例化1.基本实例化2.匿名结构体2.指针型结构体3.取结构体的地址实例化4.结构体指针进阶实例四、结构体的初始化1.未初始化的结构......
  • 如何高效寻找素数
    目录题目暴力优化埃拉托斯特尼素数筛选法题目输入n,返回[2,n)中素数的个数暴力从2开始到n,一个一个判断是不是素数,是的话就计数器加1。判断素数函数:从2开始到n,判断有没有是n的倍数,有倍数就不是素数defcountPrimes(n:int):count=0foriinrange(2,n):......
  • 【转】[java] 第一百个素数输出
    publicclassHundredthPrime{publicstaticvoidmain(String[]args){intcount=0;for(inti=2;;i++){for(intj=2;j<=i;j++){if(i%j==0){if(i>j)......
  • golang中员工分组分页获取的一种方案
    在业务中,有一个场景,A系统需要提供一个接口,返回组织架构信息,供B系统入库,即B系统的组织架构是从A系统中同步过来的。这个场景下存在一个小问题,B系统期望A系统按照组织树层序遍历分页返回。这样B系统就不需要担心新增组织时找不到父级组织了。那么A系统要怎么做呢?方案1:在数据库......