Skip to Content
学习测试驱动开发
book

学习测试驱动开发

by Saleem Siddiqui
July 2025
Intermediate to advanced
280 pages
3h 5m
Chinese
O'Reilly Media, Inc.
Book available
Content preview from 学习测试驱动开发

第 5 章 Go 中的包和模块 Go 中的包和模块

本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com

Go 程序是通过将软件包连接起来而构建的。一个 Go 程序包又是由一个或多个源文件构建而成...

Go 编程语言规范

在本章中,我们将做一些清理 Go 代码的工作。 我们将查看第 0 章中创建的 Go 模块,了解它在分离代码方面的作用。然后,我们将使用包来分离测试代码和生产代码。最后,我们将删除代码中的一些冗余部分,使代码变得紧凑而有意义。

将代码分离到包中

首先,我们要将测试代码与生产代码分开。这需要完成两项独立的任务:

  1. 将测试代码与生产代码分开。

  2. 确保仅从测试代码到生产代码之间存在依赖关系。

我们有MoneyPortfolio 的生产代码,与测试代码放在一个文件money_test.go 中。让我们先创建两个新文件,分别命名为money.goportfolio.go 。我们将把这两个文件放在$TDD_PROJECT_ROOT/go 文件夹中。然后,我们将相关类(MoneyPortfolio )的代码移到相应的文件中。这就是portfolio.go 的样子:

package main

type Portfolio []Money


func (p Portfolio) Add(money Money) Portfolio {
    p = append(p, money)
    return p
}

func (p Portfolio) Evaluate(currency string) Money {
    total := 0.0
    for _, m := range p {
        total = total + m.amount
    }
    return Money{amount: total, currency: currency}
}

此处未显示的文件money.go 同样包含Money struct 及其方法

现在运行我们的测试,它们都是绿色的。太好了!因为所有东西都在main 包中,所以我们不需要做任何特殊处理,就能从测试中访问PortfolioMoney 代码。尤其是,我们不必在测试类中添加任何import 语句,比如导入testing 模块的语句。

我们已将源代码分离到不同的文件中,但更高层次的代码组织情况如何呢?我们希望将PortfolioMoney 放在一个命名空间中,以表明它们都与 "股票 "市场有关--这也是从我们的领域中借用的另一个术语。

在进行分离之前,我们先来看看 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.
Start your free trial

You might also like

Python-Tricks

Python-Tricks

Dan Bader
Filling Execution Gaps

Filling Execution Gaps

Todd C. Williams
Mining the Social Web, 3rd Edition

Mining the Social Web, 3rd Edition

Matthew A. Russell, Mikhail Klassen

Publisher Resources

ISBN: 9798341663183Supplemental Content