Skip to content

Go通过TDD学习Go语言

Zhong Qin edited this page Jul 26, 2018 · 3 revisions

2. hello world

与"现实世界"软件相比,这当然是微不足道的,但原则依然成立。TDD 是一门需要通过开发去实践的技能,但通过将问题分解成更小的可测试的组件,编写软件的时间将更加轻松。

3. 整数

注意: 每个目录中的 Go 源文件只能属于一个包(package),请确保你的文件是分开组织的。

编写足够的代码来满足编译器,仅此而已 —— 请记住,我们要检查的是我们的测试是否因为正确的原因而失败。

一种称为基于属性测试的技巧,它将不再打扰开发者,并帮助你查找程序漏洞。

3.3 示例

与典型的测试一样,示例是存在于一个包的 _test.go 文件中的函数。

4. 迭代

for循环结构的使用 注意:基准测试默认是顺序运行的。

5. 数组和切片

数组比较笨重,大多数情况下我们都不会使用它。

5.5 一个源码版本控制的小贴士

TDD分为三步:

  • 先写测试
  • 根据错误提示,写一个最小的可以使其运行的程序占坑
  • 然后再完成内容的补充完善

此时如果你正在使用源码的版本控制工具(你应该使用它!),我会在此刻先提交一次代码。因为我们已经拥有了一个有测试支持的程序。

注意不要在重构以后忘记维护你的测试代码。

5.11 重构

测试覆盖率!go test -cover

5.12 切片

在 Go 中不能对切片使用等号运算符。你可以写一个函数迭代每个元素来检查它们的值。但是一种比较简单的办法是使用 reflect.DeepEqual,它在判断两个变量是否相等时十分有用

迭代可变参数

6. 结构体和方法

方法和函数很相似但是方法是通过一个特定类型的实例调用的。函数可以随时被调用,不像方法需要在某个事物上调用。

花些时间慢慢阅读这个错误信息是很重要的,这种习惯将对你长期有用。

把类型的第一个字母作为接收者变量是 Go 语言的一个惯例。

6.1 接口

在 Go 这种静态类型语言中是一种非常强有力的概念。因为接口可以让函数接受不同类型的参数并能创造类型安全且高解耦的代码。

方法是一些函数签名的集合!

不断尝试运行这些测试函数并让编译器引导你找到正确的方案。(区分编译错误,以及运行时产生的错误!)

7. 指针和错误

在 Go 中,**当调用一个函数或方法时,参数会被复制。**可以用 指针 来解决这个问题。指针让我们 指向 某个值,然后修改它。

类型别名有一个有趣的特性,你还可以对它们声明 方法。当你希望在现有类型之上添加一些领域内特定的功能时,这将非常有用。

9. 依赖注入

在io.writer是常用的数据出口。

依赖注入就是指我们无需关心数据的接收者。最好使用通用接口代替

10. Mocking

所谓迭代是指:确保我们采取最小的步骤让软件可用。

但是我建议任何项目都使用这种方法。在测试的支持下,将功能切分成小的功能点,并使其首尾相连顺利的运行。

11. 并发

  • goroutines 是 Go 的基本并发单元,它让我们可以同时检查多个网站。

  • anonymous functions(匿名函数),我们用它来启动每个检查网站的并发进程。

  • channels,用来组织和控制不同进程之间的交流,使我们能够避免 race condition(竞争条件) 的问题。

  • the race detector(竞争探测器) 帮助我们调试并发代码的问题。

Clone this wiki locally