go语言精进之路_note

go语言精进之路_note

第一部分 熟知Go语言的一切

第1条 了解Go语言的诞生与演进

略 ### 第2条 选择适当的Go语言版本 建议一直使用最新版本 ### 第3条 理解Go语言的设计哲学 追求简单,少即是多
偏好组合,正交解耦 原生并发,轻量高效 面向工程,“自带电池” 看看就好 用久了才能体会到 #### 第4条 使用Go语言原生编程思维来写Go代码 “萨丕尔-沃夫假说”,这个假说的内容是这样的:“语言影响或决定人类的思维方式。” 艾伦·佩利(Alan J. Perlis) “不能影响到你的编程思维方式的编程语言不值得学习和使用。” 经典问题 素数筛 c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#define LIMIT 50
#define PRIMES 10
void sieve() {
int c,i,j,numbers[LIMIT], primes[PRIMES];
for (i=0;i<LIMIT;i++){
numbers[i]=i+2; /*fill the array with natural numbers*/
}
for (i=0;i<LIMIT;i++){
if (numbers[i]!=-1){
for (j=2*numbers[i]-2;j<LIMIT;j+=numbers[i])
numbers[j]=-1; /* 筛除非素数 */
}
}
c = j = 0;
for (i=0;i<LIMIT&&j<PRIMES;i++) {
if (numbers[i]!=-1) {
primes[j++] = numbers[i]; /*transfer the primes to their own array*/
c++;
}
}
for (i=0;i<c;i++) printf("%d\n",primes[i]);
}

Haskell

1
2
3
4
sieve [] = []
sieve (x:xs) = x : sieve (filter (\a -> not $ a `mod` x == 0) xs)
n = 100
main = print $ sieve [2..n]
不懂 去看看haskell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
}
}

C版本的素数筛程序是一个常规实现。它定义了两个数组 numbers和primes,“筛”的过程在numbers这个数组中进行(基于纯内存修改),非素数的数组元素被设置为-1, 便于后续提取。

Haskell版本采用了函数递归的思路,通过“filter操作集合”,用谓词(过滤条件)-> not $ a mod x == 0筛除素数的倍数,将未筛除的数的集合作为参数传递归递给下去。

Go版本程序实现了一个并发素数筛,它采用的是goroutine的并发组合。程序从素数2开始,依次为每个素数建立一个goroutine,用于作为筛除该素数的倍数。