迭代

未匹配的标注

迭代

查看本章的所有代码

要在 Go 中重复做某件事,你需要 for。在 Go 中没有 whiledountil 关键字,你只能使用 for。这可是件好事!

让我们来为一个重复字符 5 次的函数编写测试。

目前这里没什么新知识,所以你可以自己尝试去写。

先写测试

package iteration

import "testing"

func TestRepeat(t *testing.T) {
    repeated := Repeat("a")
    expected := "aaaaa"

    if repeated != expected {
        t.Errorf("expected %q but got %q", expected, repeated)
    }
}

尝试运行测试

./repeat_test.go:6:14: undefined: Repeat

先使用最少的代码来让失败的测试跑起来

请遵守纪律! 你现在不需要学习任何新知识就可以让测试恰当地失败。

您现在需要做的就是让代码可以编译,这样您就可以检查您的测试用例是否通过。

package iteration

func  Repeat(character string)  string  {
  return  ""
}

知道你已经有足够的知识去编写一些基本问题的测试了吗?这意味着您现在可以随心所欲地处理生产环境的代码,并知道它的行为与您希望的一样。

repeat_test.go:10: expected 'aaaaa' but got ''

把代码补充完整,使得它能够通过测试

for 语法非常普通,和大多数类 C 语言一样。

func Repeat(character string) string {
    var repeated string
    for i := 0; i < 5; i++ {
        repeated = repeated + character
    }
    return repeated
}

与其它语言如 C,Java 或 JavaScript 不同,在 Go 中 for 语句前导条件部分并没有圆括号,而且大括号 { } 是必须的。你可能会好奇下面这行

  var repeated string

我们目前都是使用 := 来声明和初始化变量。然而 := 只是两个步骤的简写。这里我们使用显式的版本来声明一个 string 类型的变量。我们还可以使用 var 来声明函数,稍后我们将看到这一点。

运行测试应该是通过的。

关于 for 循环其它变体请参考这里

重构

现在是时候重构并引入另一个构造(construct)+= 赋值运算符。

const repeatCount = 5

func Repeat(character string) string {
    var repeated string
    for i := 0; i < repeatCount; i++ {
        repeated += character
    }
    return repeated
}

+= 是自增赋值运算符,它把运算符右边的值加到左边并重新赋值给左边。它在其它类型也可以使用,比如整数类型。

基准测试

在 Go 中编写 基准测试(benchmarks) 是该语言的另一个一级特性,它与编写测试非常相似。

func BenchmarkRepeat(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Repeat("a")
    }
}

你会看到上面的代码和写测试差不多。

testing.B 可使你访问隐性命名 b.N

基准测试运行时,代码会运行 b.N 次,并测量需要多长时间。

代码运行的次数不会对你产生影响,测试框架会选择一个它所认为的「最佳」值,以便让你获得更合理的结果。

go test -bench=. 来运行基准测试。 (如果在 Windows Powershell 环境下使用 go test -bench=".")

goos: darwin
goarch: amd64
pkg: github.com/quii/learn-go-with-tests/for/v4
10000000           136 ns/op
PASS

136ns /op 的意思是我们的函数(在我的计算机上)平均运行时间为 136 纳秒。这很好!为了测试这个,它运行了 1000 万次。

注意:默认情况下,基准测试按顺序运行。

实践练习

  • 更改测试,以便调用者可以指定字符重复的次数,然后修复代码

  • 写一个 ExampleRepeat 来完善你的函数文档

  • 看一下 strings 包。找到你认为可能有用的函数,并对它们编写一些测试。投入时间学习标准库会慢慢得到回报

总结

  • 更多的 TDD 练习

  • 学习了 for

  • 学习了如何编写基准测试

原文地址 Learn Go with Tests

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~