Loading

Go语言精进之路读书笔记第16条——理解Go语言的包导入

Go编译速度快的原因主要体现在以下三方面:

  • Go要求每个源文件在开头处显式地列出所有依赖的包导入,这样Go编译器不必读取和处理整个文件就可以确定其依赖的包列表。
  • Go要求包之间不能存在循环依赖。这样一个包的依赖关系便形成了一张有向无环图。由于无环,包可以被单独编译,也可以并行编译。
  • 已编译的Go包对应的目标文件中不仅记录了该包本身的导出符号信息,还记录了其所依赖包的导出符号信息。

16.1 Go程序构建过程

Go程序的构建简单来讲也是由编译(compile)和链接(link)两个阶段组成的。

16.2 究竟是路径名还是包名

编译器在编译的过程中必然要使用的编译单元(一个包)所依赖的包的源码。

基础搜索路径是一个全局的设置

  1. 所有包(无论是标准库包还是第三方包)的源码基础搜索路径都包括$GOROOT/src

  2. 在上述基础搜索路径的基础上,不同版本的Go包含的其他基础搜索路径有不同,Go 1.13版本有两种模式

    1. 经典gopath模式(GO111MODULE=off):$GOPATH/src
    2. module-aware模式下(GO111MODULE=on/auto):$GOPATH/pkg/mod

未来的Go版本将只有module-aware模式

包导入路径位于每个包源码文件头部

源文件头部的包导入语句import后面的部分就是一个路径,路径的最后一个分段也不是包名。不过Go语言有一个惯用法,那就是包导入路径的最后一段目录名最好与包名一致。

当包名与包导入路径中的最后一个目录名不同时,最好用下面的语法将包名显式放入包导入语句中:

mypkg2 "xxx.com/xxx/pkg/pkgs"

16.3 包名冲突问题

包名冲突问题通过为包导入路径下的包显式指定包名来解决

pkg1 "xxx.com/xxx/pkg/chapter3-demo1/pkg1"
mypkg1 "xxx.com/xxx/pkg/chapter3-demo2/pkg1"
posted @ 2024-02-07 17:41  brynchen  阅读(10)  评论(0编辑  收藏  举报