第 5 章 Go 中的包和模块 Go 中的包和模块
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
Go 程序是通过将软件包连接起来而构建的。一个 Go 程序包又是由一个或多个源文件构建而成...
在本章中,我们将做一些清理 Go 代码的工作。 我们将查看第 0 章中创建的 Go 模块,了解它在分离代码方面的作用。然后,我们将使用包来分离测试代码和生产代码。最后,我们将删除代码中的一些冗余部分,使代码变得紧凑而有意义。
将代码分离到包中
首先,我们要将测试代码与生产代码分开。这需要完成两项独立的任务:
-
将测试代码与生产代码分开。
-
确保仅从测试代码到生产代码之间存在依赖关系。
我们有Money 和Portfolio 的生产代码,与测试代码放在一个文件money_test.go 中。让我们先创建两个新文件,分别命名为money.go 和portfolio.go 。我们将把这两个文件放在$TDD_PROJECT_ROOT/go 文件夹中。然后,我们将相关类(Money 和Portfolio )的代码移到相应的文件中。这就是portfolio.go 的样子:
packagemaintypePortfolio[]Moneyfunc(pPortfolio)Add(moneyMoney)Portfolio{p=append(p,money)returnp}func(pPortfolio)Evaluate(currencystring)Money{total:=0.0for_,m:=rangep{total=total+m.amount}returnMoney{amount:total,currency:currency}}
此处未显示的文件money.go 同样包含Money struct 及其方法。
现在运行我们的测试,它们都是绿色的。太好了!因为所有东西都在main 包中,所以我们不需要做任何特殊处理,就能从测试中访问Portfolio 和Money 代码。尤其是,我们不必在测试类中添加任何import 语句,比如导入testing 模块的语句。
我们已将源代码分离到不同的文件中,但更高层次的代码组织情况如何呢?我们希望将Portfolio 和Money 放在一个命名空间中,以表明它们都与 "股票 "市场有关--这也是从我们的领域中借用的另一个术语。
在进行分离之前,我们先来看看 Go 中的模块和包是如何工作的。
Go 模块
Go 程序通常由多个源文件组成。 每个 Go 源文件都会声明它所属的包。该声明位于文件的第一行代码中。在我们的三个源文件中,声明都是package main ,说明我们的所有代码目前都位于main 包中。
一般来说,Go 代码库包含一个模块。该模块包含多个包,而每个包又包含多个文件。
重要
在 Go 中,模块支持是一个快速发展的特性,也是一个备受关注的话题。本书使用模块模式,它是 Go v1.13 以后的默认(也是最受欢迎的)风格。 使用GOPATH 的旧样式在很大程度上与 Go 模块不兼容。GOPATH本书不使用-style。
任何必须作为应用程序运行的程序--即任何具有main() 功能的文件--都必须放在main 包中。 main 包中可能还有其他包含结构体、函数、类型等的文件。此外,还可能有其他软件包。Go 程序的一般结构