四、项目结构
gitGomoduleprojectcommoncommoncommonmain4.1 考虑更少、更大的包
对于从其他语言过渡到 Go 语言的程序员来说,我常常在代码审查中提到的一件事是他们会过度使用包。
GoJavapublicprotectedprivatedefaultC++friendGopublicprivateGoNote: 你可能会听到人们说 exported 与 not exported, 这跟 public 和 private 是一样的。
GoTips: 除 cmd/ 和 internal/ 之外的每个包都应包含一些源代码。
我总是建议宁愿选择少一点,大一点的包。 你的默认立场应该是不创建新的包。 这将导致太多类型被公开,这会导致你的包有一个宽而浅的API。 【这里理解宽而浅的API是有很多API但是却没有深层次的调用,只有一层的API】
以下部分将更为详细地探讨这一建议。
Java4.1.1. 通过 import 语句将代码整理到文件中
Goimport.go这里是我日常使用的指导规则:
package httphttphttp.gomessages.goRequestResponseclient.goClientserver.goServerimportmessages.goHTTPhttp.goclient.goserver.goHTTPTips:源文件名应该以名词作为首选。
Note:Go编译器并行编译每个包。 在一个包中,编译器并行编译每个函数(方法只是 Go 语言中函数的另一种写法)。 更改包中代码的布局不会影响编译时间。
4.1.2. 优先内部测试再到外部测试
go tooltestinghttp2http2_test.gohttp2http2_test.gohttp2go tooltestpackage http_test我建议在编写单元测试时使用内部测试。这样你就可以直接测试每个函数或方法,避免外部测试干扰。
Examplegodoc避免复杂的包层次结构,抵制应用分类法Gogo toolnet/httpnet.gointernalgo toolinternal/internal/internal/gointernalinternal.../a/b/c/internal/d/e/f.../a/b/c/.../a/b/gmainmainmainmain.mainmaintestsmain.mainmainmain.mainmain.mainmain.initmain.mainmainmainmainflags