Go 编程模式:Go Generation
图片来源:GopherSource
在本篇文章中,我们将要学习一下Go语言的代码生成的玩法。Go语言代码生成主要还是用来解决编程泛型的问题,泛型编程主要解决的问题是因为静态类型语言有类型,所以,相关的算法或是对数据处理的程序会因为类型不同而需要复制一份,这样导致数据类型和算法功能耦合的问题。泛型编程可以解决这样的问题,就是说,在写代码的时候,不用关心处理数据的类型,只需要关心相当处理逻辑。泛型编程是静态语言中非常非常重要的特征,如果没有泛型,我们很难做到多态,也很难完成抽象,会导致我们的代码冗余量很大。
本文是全系列中第6 / 10篇:Go编程模式
Go编程模式:切片,接口,时间和性能
Go 编程模式:错误处理
Go 编程模式:Functional Options
Go编程模式:委托和反转控制
Go编程模式:Map-Reduce
Go 编程模式:Go Generation
Go编程模式:修饰器
Go编程模式:Pipeline
Go 编程模式:k8s Visitor 模式
Go编程模式 : 泛型编程
« ...
打印质数的各种算法
打印质数的算法应该是学习计算机编程的一个经典的问题,在这里想给大家展示一些方法,相信这些方法会对你的编程有一定的启发作用。请你注意几点,
实际应用和教学应用有很大的差别。
最后的那个使用编译时而不是运行时的方法大家可以重点看看。
目录
教科书的示例
较好的算法
实际应用的算法
使用编译时而不是运行时
教科书的示例
首先,先给一个教科书的示例。下面这个示例应该是教科书(至少是我上大学时的教科学)中算法复杂度最好的例子了。其想法很简单,先写一个判断是否是质数的函数isPrime(),然后从1到n分别调用isPrime()函数来检查。检查是否是质数的算法是核心,其简单的使用从2到n的开根的数作为除数。这样的算法复杂度几乎是O(n*log(n)),看上去不错,但其实很不经济。
#include <iostream>
using namespace std;
bool isPrime(int nr)
{
for (int d = 2; (d * d) < (nr + 1); ++d){
...