在python中, 程序由模块组成, 一个文件就是一个模块.

在go中, 程序是由包组成, 一个目录是一个包, 弱化单一文件的概念. 在同一个包内, 包级变量和函数在哪里声明都一样. 对于python开发者而言, go中的一个包都可以视为python的一个文件.

python中也存在 的概念. python中的包, 实质上是一个包含__init__.py文件的目录, 比如

packageA
|---- __init__.py
|---- module1.py
|---- module2.py

文件__init__.py内容默认为空, 如果不为空, 一般是执行包的初始化或包内模块导出(类似javascript中的index.js文件). 在包内可以存在子目录, 如果该子目录下也有__init__.py文件, 则该目录也是一个包.

在go中, 一个目录天然就是一个包. 如果包内有子目录, 则该子目录组成另一个包.

go开发者编写一个包时, 有几点需要注意

  • 一个包等同于一个目录。即一个目录下只能有一个包, 一个包的文件也不能分散到多个目录
  • 在一个程序内, 并不需要所有的包名都不同。 因为包导入是全路径的。目录不同肯定就不是同一个包
  • 导入一个包后, 代码中使用的包名就是该包自己定义的名称。 当然,导入后可以修改引用的名称。