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
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
4sieve [] = []
sieve (x:xs) = x : sieve (filter (\a -> not $ a `mod` x == 0) xs)
n = 100
main = print $ sieve [2..n]
1 | func Generate(ch chan<- int) { |
C版本的素数筛程序是一个常规实现。它定义了两个数组 numbers和primes,“筛”的过程在numbers这个数组中进行(基于纯内存修改),非素数的数组元素被设置为-1, 便于后续提取。
Haskell版本采用了函数递归的思路,通过“filter操作集合”,用谓词(过滤条件)->
not $ a mod
x ==
0筛除素数的倍数,将未筛除的数的集合作为参数传递归递给下去。
Go版本程序实现了一个并发素数筛,它采用的是goroutine的并发组合。程序从素数2开始,依次为每个素数建立一个goroutine,用于作为筛除该素数的倍数。