17611538698
webmaster@21cto.com

如何组织你的 Go 代码

编程语言 0 38 2024-12-23 09:00:33

刚接触 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 应用程序就像培育一个花园。

我们从一两朵小花开始。下周,你可以再添加几朵。随着它们生长和开花,将它们摆放在架子上。你不必从建造温室、架子、浇水基础设施和通风系统开始。你可以稍后再添加它们,只要你需要~


作者:场长

评论