看到这个标题,几乎不用思考,这还不简单,直接初始化 i=2然后步长为2,直到等于200的时候退出循环就行了。来试试:

func main() {
	for i := 2;i<=200;i=i+2 {
		fmt.Println(i)
	}
}

截取最后几个的输出如下:

194
196
198
200

这确实是个很简单的程序,还有其他实现办法吗?
刚刚的核心思想是我们知道第100个偶数的值是200,我们可以换个思路,用count来记录已经打印的偶数数量,然后循环中去判断count是否已经达到了100,达到了退出循环。来试试:

func main() {
	n := 2
	for count := 0; count < 100; count++ {
		fmt.Println(n)
		n = n + 2
	}
}

结果当然也是如此:

194
196
198
200

事情到这结束了吗?还没,再想想还有什么思路。
哦对了,我们可以把偶数的生成过程抽象出来。具体来说,我们知道,第n个偶数的值是2n,我们可以定一个偶数生成器闭包,来试试:

func even() func(int) int {
	return func(n int) int {
		return 2 * n
	}
}
func main() {
	generator := even()
	for n := 1; n <= 100; n++ {
		fmt.Println(generator(n))
	}
}

结果仍旧一样:

194
196
198
200

下面的内容肯定猜到了,那还有什么思路吗?
或许我们可以开几个线程,比如2个线程,每个线程打印50个,最后合到一起输出?来试试:

func even(begin, end int, result chan int) {
	for i := begin; i <= end; i++ {
		result <- 2 * i
	}
	close(result)
}
func main() {
	result := make(chan int)
	go even(1, 50, result)
	go even(51, 100, result)
	for i := range result {
		fmt.Println(i)
	}
}

多线程的结果虽然正确,但是输出顺序那就不可预测了,如下:

190
192
194
196
198
64
200

可能还可以丧心病狂一下,比如我希望打印完第100个偶数的时候,系统通知一下不要再打了,主动退出线程?那我们来试试:

func even(c, quit chan int) {
	n := 0
	for {
		select {
		case c <- n:
			n = n + 2
		case <-quit:
			fmt.Println("bye")
			return
		}
	}

}
func main() {
	c := make(chan int)
	quit := make(chan int)
	go func() {
		for i := 0; i <= 100; i++ {
			fmt.Println(<-c)
		}
		quit <- 1
	}()
	even(c, quit)
}

因为这就是一个线程,结果也是有顺序的:

194
196
198
200
bye

好了,就结束吧,这是一篇划水博客。总的来说,虽然是个简单的程序,但是其实思路还有好多,比如我在分布式系统,如何保证这100个只生成一次呢?又或者如何不用循环?现实世界复杂多变,软件世界也如此,用句老话说就是:没有银弹。