第 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 程序的一般结构
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access