42. sieve.go,2008年7月22日-<用于发送;-<用于接收。Channel仍然是指针。但现在main不是大写字母开头的了。 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 26 27 28 29 30 31 32 33 34 35 36 | 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 Sieve() {
ch := new (chan int );
go Generate(ch);
for {
prime := <-ch;
printf( "%d\n" , prime);
ch1 := new (chan int );
go Filter(ch, ch1, prime);
ch = ch1
}
}
func main() {
Sieve()
}
|
43、sieve.go,2008年9月17日通信操作符现在是<-。channel仍然是指针。 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 26 27 28 29 30 31 32 33 34 35 36 | 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 Sieve() {
ch := new (chan int );
go Generate(ch);
for {
prime := <-ch;
print(prime, "\n" );
ch1 := new (chan int );
go Filter(ch, ch1, prime);
ch = ch1
}
}
func main() {
Sieve()
}
|
44、sieve.go,2009年1月6日引入了make内置操作符。没有指针。编码错误!(有个*被留下了,错误的参数类型) 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 26 27 28 29 30 31 32 33 34 35 36 | 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 Sieve() {
ch := make(chan int );
go Generate(ch);
for {
prime := <-ch;
print(prime, "\n" );
ch1 := make(chan int );
go Filter(ch, ch1, prime);
ch = ch1
}
}
func main() {
Sieve()
}
|
45、sieve.go,2009年9月25日第一个正确的现代版本。同样,大写头母不见了,使用了fmt。 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 26 27 28 29 30 31 32 33 34 35 36 37 | package main
import "fmt"
func generate(ch chan<- int ) {
for i := 2; ; i++ {
ch <- i;
}
}
func filter(src <-chan int , dst chan<- int , prime int ) {
for i := range src {
if i%prime != 0 {
dst <- i;
}
}
}
func sieve() {
ch := make(chan int );
go generate(ch);
for {
prime := <-ch;
fmt.Print(prime, "\n" );
ch1 := make(chan int );
go filter(ch, ch1, prime);
ch = ch1;
}
}
func main() {
sieve();
}
|
46、sieve.go,2009年12月10日分号不见了。程序已经与现在一致了。 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 26 27 28 29 30 31 32 33 34 35 36 37 | package main
import "fmt"
func generate(ch chan<- int ) {
for i := 2; ; i++ {
ch <- i
}
}
func filter(src <-chan int , dst chan<- int , prime int ) {
for i := range src {
if i%prime != 0 {
dst <- i
}
}
}
func sieve() {
ch := make(chan int )
go generate(ch)
for {
prime := <-ch
fmt.Print(prime, "\n" )
ch1 := make(chan int )
go filter(ch, ch1, prime)
ch = ch1
}
}
func main() {
sieve()
}
|
这个优美的方案来自于几十年的设计过程。
47、旁边,没有讨论到的select 真实并发程序的核心连接器(connector) 最初起源于Dijkstra的守卫命令(guarded command) 在Hoare的CSP理论实现真正并发。 经过Newsqueak、Alef、Limbo和其他语言改良后 2008年3月26日出现在Go版本中。 简单,澄清,语法方面的考虑。
48、稳定性Sieve程序自从2009年末就再未改变过。– 稳定! 开源系统并不总是兼容和稳定的。 但,Go是。(兼容和稳定的) 这是Go成功的一个重要原因。
49、趋势图数据展示了Go 1.0发布后Go语言的爆发。
50、成功Go成功的元素: 显然的:功能和工具。 * 并发 * 垃圾回收 * 高效的实现 * 给人以动态类型体验的静态类型系统 * 丰富但规模有限的标准库 * 工具化 * gofmt * 在大规模系统中的应用 不那么显然的:过程 * 始终聚焦最初的目标 * 在冻结后的集中开发 * 小核心团队易于取得一致 * 社区的重要贡献 * 丰富的生态系统
总之,开源社区共享了我们的使命,聚焦于为当今的世界设计一门语言。
原文出处:tonybai.com |