golang为什么用import,而不用include

一直疑惑golang为什么用import机制导入依赖包,而不用C/C++那种include机制导入依赖头文件。
反复思考,查找,实践,终于有些眉目,现在记录下来。

import编译过程

1、产生中间文件xx.a:

按照包粒度进行编译,生成每个包的package.a,比如context.a是context包编译产生的中间文件。

2、链接

将第一步生成的package1.a、package2.a … 等程序中所有包的中间文件,链接起来,生成可执行文件,作为编译产出。

include编译过程

1、产生中间文件xx.a

按照源文件粒度进行编译,每个.c/.cpp文件都会编译为同名的.a文件。
编译前会将所有的头文件都加入到源文件中,相当于扩展了源文件的代码数量。会有代码膨胀,同个头文件,在不同源文件中被依赖,这两个源文件没有相互依赖,则该被依赖的头文件会在这两个源文件中被编译两次。

2、链接

将第一步中生成的所有xx.a链接起来,行程可执行文件,作为编译产出。
从上面可以得出:
golang的import会减少依赖程序的编译次数,节约编译时间。
另外golang在编译器级别支持增量编译,go build可自动识别修改的包,只对修改的包进行编译(依赖、间接依赖被修改,也会重新编译)。
import导入机制、增量编译机制、关键字少(只有25个)使得golang编译速度比较快。
摘录其他人的表述:Go编译器是原生支持增量构建的,无需第三方构建管理工具的辅助。Go的增量构建是建立在Go 1.10引入的build cache机制的基础上的。Go的增量构建以Go包为单位,当Go包中的任一源文件发生变化时,Go都会对其进行重新构建,并且会连带构建所有直接或间接依赖该包的Go包
golang按照包粒度进行增量编译构建,这篇文章讲的很详细:golang增量构建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值