我正在尝试实现一个非常简单的测试函数来验证来自我的欧拉问题解决方案的结果。
在下面的代码中,我创建了一个切片映射,在索引 0 上,我调用了返回整数的函数,在索引 1 上调用了我期望从该函数获得的结果。
package euler
import "testing"
func TestEulers(t *testing.T) {
tests := map[string][]int{
"Euler1": {Euler1(), 233168},
"Euler2": {Euler2(), 4613732},
"Euler3": {Euler3(), 6857},
"Euler4": {Euler4(), 906609},
"Euler5": {Euler5(), 232792560},
"Euler6": {Euler6(), 25164150},
}
for key, value := range tests {
if value[0] != value[1] {
t.Errorf("%s\nExpected: %d\nGot:%d",
key, value[0], value[1])
}
}
}
对于该映射,每个函数都可以正常工作并返回我期望的结果,如果我一个一个运行,或者如果我发表评论,比如说,这些键/值的一半。
例如,如果我用注释的这些行调用上面的函数,则测试将通过。
tests := map[string][]int{
"Euler1": {Euler1(), 233168},
// "Euler2": {Euler2(), 4613732},
"Euler3": {Euler3(), 6857},
"Euler4": {Euler4(), 906609},
// "Euler5": {Euler5(), 232792560},
// "Euler6": {Euler6(), 25164150},
}
但是,例如,如果我按照这种方式安排评论,则测试不会。
tests := map[string][]int{
//"Euler1": {Euler1(), 233168},
"Euler2": {Euler2(), 4613732},
"Euler3": {Euler3(), 6857},
"Euler4": {Euler4(), 906609},
//"Euler5": {Euler5(), 232792560},
// "Euler6": {Euler6(), 25164150},
}
但是,我检查了每一个功能,它们都按预期工作。如果需要,您可以访问Euler 源代码或包编号和字符串。
在 Euler2 函数中,我有一个 defer 语句来关闭从 FibonacciGen 接收的通道。
在 FibonacciGen 上,我确实有另一个 defer 语句来关闭相同的通道。
看来这是我的第一个错误。我应该只有一个而不是两个语句来关闭通道,因为它们试图关闭相同的东西。那是对的吗?
其次(在这里我什至有点不确定), defer 语句将阻止函数被调用,直到主 goroutine 返回,对吗?独立地,如果我在包 main 上调用它?
另外,由于数据通过通道从 FibonacciGen 流向主函数。在我看来,如果我在 FibonacciGen 关闭通道,我不需要通知主函数。但是如果我关闭主函数上的通道,我必须通知 FibonacciGen 停止尝试发送到这个通道。
千万里不及你
函数式编程
相关分类