sum_test.go
中:numbers := [5]int{1, 2, 3, 4, 5}
numbers := [...]int{1, 2, 3, 4, 5}
%v
(默认输出格式)占位符来打印输入,它非常适用于展示数组。go test
运行测试将会报编译时错误:./sum_test.go:10:15: undefined: Sum
。Sum.go
sum_test.go:13: got 0 want 15 given, [1 2 3 4 5]
array[index]
语法来获取数组中指定索引对应的值。在本例中我们使用 for
循环分 5 次取出数组中的元素并与 sum
变量求和。[4]int
作为 [5]int
类型的参数传入函数,是不能通过编译的。它们是不同的类型,就像尝试将 string
当做 int
类型的参数传入函数一样。Sum
函数。mySlice := []int{1,2,3}
而不是 mySlice := [3]int{1,2,3}
./sum_test.go:22:13: cannot use numbers (type []int) as type [5]int in argument to Sum
。Sum
函数的参数从数组改为切片。如果这么做我们就有可能会影响使用这个 API 的人,因为我们的 其他 测试不能编译通过。Sum
补充完整,使得它能够通过测试:Sum
函数把参数从数组改为切片。注意不要在重构以后忘记维护你的测试代码。go test -cover
SumAll
函数,它接受多个切片,并返回由每个切片元素的总和组成的新切片。SumAll([]int{1,2}, []int{0,9})
返回 []int{3, 9}
SumAll([]int{1,1,1})
返回 []int{3}
./sum_test.go:23:9: undefined: SumAll
SumAll
。./sum_test.go:26:9: invalid operation: got != want (slice can only be compared to nil)
import reflect
,这样你才能使用 DeepEqual
方法。reflect.DeepEqual
不是「类型安全」的,所以有时候会发生比较怪异的行为。为了看到这种行为,暂时将测试修改为:slice
和 string
。这显然是不合理的,但是却通过了编译!所以使用 reflect.DeepEqual
比较简洁但是在使用时需多加小心。sum_test.go:30: got [] want [3 9]
Sum
计算每个参数的总和并把结果放入函数返回的切片中。make
可以在创建切片的时候指定我们需要的长度和容量。=
对切片元素进行赋值。mySlice[10]=1
进行赋值,会报运行时错误。append
函数,它能为切片追加一个新值。SumAll
变成 SumAllTails
。它会把每个切片的尾部元素相加(尾部的意思就是除去第一个元素以外的其他元素)。./sum_test.go:26:9: undefined: SumAllTails
SumAllTails
并重新运行测试sum_test.go:30: got [3 9] want [2 9]
slice[low:high]
获取部分切片。如果在冒号的一侧没有数字就会一直取到最边缘的元素。在我们的函数中,我们使用 numbers[1:]
取到从索引 1 到最后一个元素。你可能需要花费一些时间才能熟悉切片的操作。myEmptySlice[1:]
会发生什么?checkSums(t, got, "dave")
是不能通过编译的。append
从原来的切片中创建一个新切片len
获取数组和切片的长度reflect.DeepEqual
的妙用和对代码类型安全性的影响[][]string
。