Gofmt 是 Go 语言在解决规模化(scale)问题上的一个最佳实践,并成为了 Go 语言吸引其他语言开发者的一大卖点。很多其他主流语言也在效仿 Go 语言推出自己的 format 工具,比如:Java formatter、Clang formatter、Dartfmt 等。因此,作为 Go 开发人员,请在提交你的代码前使用 Gofmt 格式化你的 Go 源码。

go语言学习笔记40  原理与实践_编译型语言

如果你之前更熟悉某种类似于 Ruby、Python 或 JavaScript 之类的动态语言,你可能还不太习惯在运行之前需要先进行编译的情况。Go 是一种编译型语言,这意味着只有你编译完 Go 程序之后,才可以将生成的可执行文件交付于其他人,并运行在没有安装 Go 的环境中。

go语言学习笔记40  原理与实践_动态语言_02

go语言学习笔记40  原理与实践_动态语言_03

go语言学习笔记40  原理与实践_动态语言_04

go语言学习笔记40  原理与实践_动态语言_05

go语言学习笔记40  原理与实践_编译型语言_06

Go项目的布局标准

go语言学习笔记40  原理与实践_编译型语言_07

go语言学习笔记40  原理与实践_项目结构_08

go语言学习笔记40  原理与实践_动态语言_09

第三个特点,你会看到 src 下的二级目录 pkg 下面存放着运行时实现、标准库包实现,这些包既可以被上面 cmd 下各程序所导入,也可以被 Go 语言项目之外的 Go 程序依赖并导入。下面是我们通过 tree 命令查看 pkg 下面结构的输出结果:

go语言学习笔记40  原理与实践_编译型语言_10

go语言学习笔记40  原理与实践_动态语言_11

go语言学习笔记40  原理与实践_动态语言_12

go语言学习笔记40  原理与实践_项目结构_13

go语言学习笔记40  原理与实践_项目结构_14

go语言学习笔记40  原理与实践_项目结构_15

Go 库项目的初衷是为了对外部(开源或组织内部公开)暴露 API,对于仅限项目内部使用而不想暴露到外部的包,可以放在项目顶层的 internal 目录下面。当然 internal 也可以有多个并存在于项目结构中的任一目录层级中,关键是项目结构设计人员要明确各级 internal 包的应用层次和范围。

go语言学习笔记40  原理与实践_编译型语言_16

Go是怎么解决包依赖管理问题

go语言学习笔记40  原理与实践_编译型语言_17

go语言学习笔记40  原理与实践_动态语言_18

go语言学习笔记40  原理与实践_动态语言_19

go语言学习笔记40  原理与实践_编译型语言_20

go语言学习笔记40  原理与实践_编译型语言_21

go语言学习笔记40  原理与实践_项目结构_22

go语言学习笔记40  原理与实践_项目结构_23

go语言学习笔记40  原理与实践_动态语言_24

go语言学习笔记40  原理与实践_编译型语言_25

go语言学习笔记40  原理与实践_动态语言_26

go语言学习笔记40  原理与实践_动态语言_27

go语言学习笔记40  原理与实践_项目结构_28

go语言学习笔记40  原理与实践_编译型语言_29

Go Module的6类常规操作

go语言学习笔记40  原理与实践_编译型语言_30

go语言学习笔记40  原理与实践_项目结构_31

go语言学习笔记40  原理与实践_动态语言_32

go语言学习笔记40  原理与实践_编译型语言_33

go语言学习笔记40  原理与实践_动态语言_34

go语言学习笔记40  原理与实践_项目结构_35

Go程序的执行次序

go语言学习笔记40  原理与实践_项目结构_36

go语言学习笔记40  原理与实践_项目结构_37

go语言学习笔记40  原理与实践_项目结构_38

go语言学习笔记40  原理与实践_项目结构_39

go语言学习笔记40  原理与实践_编译型语言_40

go语言学习笔记40  原理与实践_编译型语言_41

go语言学习笔记40  原理与实践_编译型语言_42

go语言学习笔记40  原理与实践_编译型语言_43

go语言学习笔记40  原理与实践_编译型语言_44

go语言学习笔记40  原理与实践_动态语言_45

go语言学习笔记40  原理与实践_动态语言_46

go语言学习笔记40  原理与实践_动态语言_47

实际上,这种通过在 init 函数中注册自己的实现的模式,就有效降低了 Go 包对外的直接暴露,尤其是包级变量的暴露,从而避免了外部通过包级变量对包状态的改动