刚接触 Go 的开发人员可能会面临以下的诸多迷惑:
应该如何组织我的 Go 代码?应该创建哪些目录?有多少嵌套层级?应该将哪些文件放在哪里?测试和测试数据如何?我应该遵循这个和那个模板吗?我们可以自动生成项目结构吗?
如果你有在开发 Rails 或 Django Web 应用程序开发经验,那么刚刚接触 Go 时,可能会感到迷惑。你可能会看到人们创建目录树,用空文件填充它们,然后尝试将不断增长的 Go 代码放入其中。
在某个时刻,你很快就会恍然大悟,然后你会问:这是一种很好的、很直接的方法吗?
让我们开始构建一个新项目。我们的第一步是什么?我们需要从哪里开始?为Shodan服务创建一个 Go API 客户端。Shodan 是世界上第一个专注于互联网连接设备的搜索引擎。你想知道你所在城镇不安全的网络摄像头的 IP 地址吗?你知道你为邻居配置的服务器是否暴露了他的私人数据吗?使用Shodan,寻找安全漏洞是一个有趣又令人兴奋的旅程。
首先需要考虑项目名称,这也是 GitHub 上 Go 模块的名称。
为了练习,我们将其命名godan为 Shodan 的 Go SDK/API。
godan
有了名字之后,我们再创建一个同名的目录。
mkdir godan
完成了第一步后,让我们进入新家并开始布置内部设施。
cd godan
创建 Go 模块(包)
我们的下一步是初始化godan目录并使其成为 Go 模块的主目录。为此,我们使用命令go mod init。由于我们将在 GitHub 上托管该模块,因此我们将其命名为github.com/qba73/godan。
go mod init github.com/qba73/godan
完成此步骤后,目录godan中有一个文件:go.mod。该文件是什么样的?
go.mod
module github.com/qba73/godan
go 1.23.4
第一行是模块的名称。下一行告诉我们将使用哪个版本的 Go。请注意,Go 的版本与您的机器上安装的版本相匹配!
到目前为止一切顺利。下一步是什么?不,我们目前不需要任何目录。我们不需要担心哪些代码是内部的,哪些不是——忘掉它吧!我们需要创建两个文件:一个用于测试,一个用于我们的代码。
让我们来创建它们。
touch godan_test.go
touch godan.go
你注意到了这个模式了吗?两个文件的名称都与模块名称匹配:godan。
接下来,我们编辑两个文件并添加包名称。
godan.go package godan
godan_test.go
package
godan_test
等等!为什么是godan_test?为什么不是godan?名称表明测试godan_test.go将导入godan包。这意味着我们将专注于测试导出的函数、构成包 API 的函数以及描述包行为!
好的,让我们检查一下目前为止我们拥有什么。tree 命令显示我们的模块结构。
tree
.
├── go.mod
├── godan.go
└── godan_test.go
1 directory, 3 files
有一个目录(Go 模块)和三个文件。我们还需要其他东西吗?不,什么都没有!这就是我们开始使用测试设计行为所需的全部内容。我们可以专注于添加功能!我们可以扩展 Go 模块,一个接一个地进行测试,一个接一个地实现功能。
是的,应用KISS和YAGNI原则!
添加 CLI
当我们决定将 CLI 添加到不断增长的库中时,我们该怎么做?啊哈!现在是创建第一个目录的时候了。让我们将其命名为cmd。
mkdir cmd
main.go 我们在cmd目录中创建该文件。
tree
.
├── cmd
│ └── main.go
├── go.mod
├── godan.go
└── godan_test.go
2 directories, 4 files
什么是main.go?它是我们 Go 应用程序的主入口!main.go导入包godan。理想情况下,函数的唯一职责main是调用godan包中的一些导出函数。例如:godan.RunCLI或godan.Main或类似的东西。
cmd/main.go
package main
import "github.com/qba73/godan"
func main () {
// Call your app entry point here.
}
这就是我们开发godan包所需的全部内容。
如果我们需要 CLI(命令行界面),则cmd目录main中的函数main.go就可以完成这项工作。
所有设计决策都始于包装,也终于包装。
–B·肯尼迪
我们不需要花哨的生成器。但需要一种有机的设计方法。
以下是 Go 思维方式的关键区别:
1、保持简单
2、注重可读性
3、让事情变得容易理解
将设计决策推迟到合适的时机——当您看到哪些功能可以成为单独的包、文件等的良好候选者时。这可能要等很长时间,也可能永远不会发生。
构建 Go 应用程序就像培育一个花园。
我们从一两朵小花开始。下周,你可以再添加几朵。随着它们生长和开花,将它们摆放在架子上。你不必从建造温室、架子、浇水基础设施和通风系统开始。你可以稍后再添加它们,只要你需要~
作者:场长
本文为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。