求以下 golang 生成素数的逻辑,没看不懂,求大神解析以下谢谢

qq_33277019 2015-12-06 10:02:22
package main

func Generate(ch chan<- int) {
for i := 2; ; i++ {
ch <- i
}
}

func Filter(in <-chan int, out chan<- int, prime int) {
for {
i := <-in
if i%prime != 0 {
out <- i
}
}
}

func main() {

ch := make(chan int)
go Generate(ch)

for i := 0; i < 10; i++ {
prime := <-ch

print(prime, "\n")

ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
}
}


输出结果
2
3
5
7
11
13
17
19
23
29

...全文
128 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pcboyxhy 2016-01-22
  • 打赏
  • 举报
回复
引用 4 楼 qq_33277019 的回复:
[quote=引用 1 楼 pcboyxhy 的回复:] Generate产生2-N的序列依次写入chan,main中循环第一次读到2,然后调用Filter(ch, ch1, 2),这个Filter读取3-N,并从中删除2的倍数的数,将它输出到ch1,注意ch = ch1这一行,此时main中的ch的输入是第一轮循环中的Filter的输出,即过滤掉2的倍数的数的序列。第二轮循环开始时,ch序列是3,5,7,9,11,13,15,.....,先输出3,然后删除这个序列中3的倍数,将输出串联到下一次循环的输入。 一个删除了所有比它小的素数的倍数的数的序列,就是一个素数序列。
感谢,不过理解起来还是不太容易 特别是ch = ch1 这一行, ch有什么变化 ,ch1又有什么变化呢?(chan的赋值) 分已经给你了, 如果可以的话, 麻烦说说这一块[/quote]
    for i := 0; i < 10; i++ {
        prime := <-ch
 
        print(prime, "\n")
 
        ch1 := make(chan int)
        go Filter(ch, ch1, prime)
        ch = ch1
    }
ch = ch1很关键,语句的直接含义是,把ch1的值复制给ch,此后,对ch的读写等同对ch1的读写。 假设ch一开始是编号为0,ch1编号为1,go Filter(ch, ch1, prime)里面,从编号为0的chan读,然后写入编号为1的chan, 第一次循环结束的时候,把ch的编号改为1,然后下一轮迭代开始的时候,ch1 := make(chan int) 创建了编号为2的chan, 此后的go Filter(ch, ch1, prime)恰好吧编号为1的chan作为输入,把编号为2的chan作为输出,循环迭代下去,效果就是 routine1,从0读,写入1 routine2,从1读,写入2 routine3,从2读,写入3 routine4,从3读,写入4 ............ 所有的routine就窜起来了
qq_33277019 2016-01-21
  • 打赏
  • 举报
回复
引用 1 楼 pcboyxhy 的回复:
Generate产生2-N的序列依次写入chan,main中循环第一次读到2,然后调用Filter(ch, ch1, 2),这个Filter读取3-N,并从中删除2的倍数的数,将它输出到ch1,注意ch = ch1这一行,此时main中的ch的输入是第一轮循环中的Filter的输出,即过滤掉2的倍数的数的序列。第二轮循环开始时,ch序列是3,5,7,9,11,13,15,.....,先输出3,然后删除这个序列中3的倍数,将输出串联到下一次循环的输入。 一个删除了所有比它小的素数的倍数的数的序列,就是一个素数序列。
感谢,不过理解起来还是不太容易 特别是ch = ch1 这一行, ch有什么变化 ,ch1又有什么变化呢?(chan的赋值) 分已经给你了, 如果可以的话, 麻烦说说这一块
qq_33277019 2016-01-21
  • 打赏
  • 举报
回复
引用 1 楼 pcboyxhy 的回复:
Generate产生2-N的序列依次写入chan,main中循环第一次读到2,然后调用Filter(ch, ch1, 2),这个Filter读取3-N,并从中删除2的倍数的数,将它输出到ch1,注意ch = ch1这一行,此时main中的ch的输入是第一轮循环中的Filter的输出,即过滤掉2的倍数的数的序列。第二轮循环开始时,ch序列是3,5,7,9,11,13,15,.....,先输出3,然后删除这个序列中3的倍数,将输出串联到下一次循环的输入。 一个删除了所有比它小的素数的倍数的数的序列,就是一个素数序列。
感谢,不过理解起来还是不太容易 特别是ch = ch1 这一行, ch有什么变化 ,ch1又有什么变化呢?(chan的赋值) 分已经给你了, 如果可以的话, 麻烦
SimonYCJ 2015-12-09
  • 打赏
  • 举报
回复
hi qq_33277019,我想你只是不明白in <-chan int 的意思吧,它意思是接受一个channel返回值,这样的做法应该goroutine的一种设计模式叫做pipeline,给你一个简单的demo跑几遍就明白了。 package main import ( "fmt" ) func main() { for result := range sq(sq(gen(2, 3))) { fmt.Println(result) } } func gen(nums ...int) <-chan int { out := make(chan int) go func() { for _, n := range nums { out <- n //fmt.Printf(" %v 插入 gen的out \n", n) } close(out) }() return out } func sq(in <-chan int) <-chan int { out := make(chan int) go func() { for n := range in { out <- n * n //fmt.Printf(" %v 插入 sq的out \n", n*n) } close(out) }() return out }
pcboyxhy 2015-12-07
  • 打赏
  • 举报
回复
Generate产生2-N的序列依次写入chan,main中循环第一次读到2,然后调用Filter(ch, ch1, 2),这个Filter读取3-N,并从中删除2的倍数的数,将它输出到ch1,注意ch = ch1这一行,此时main中的ch的输入是第一轮循环中的Filter的输出,即过滤掉2的倍数的数的序列。第二轮循环开始时,ch序列是3,5,7,9,11,13,15,.....,先输出3,然后删除这个序列中3的倍数,将输出串联到下一次循环的输入。 一个删除了所有比它小的素数的倍数的数的序列,就是一个素数序列。

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧