猿问

Go - 编译一组函数时出错

我正在尝试实现一个非常简单的测试函数来验证来自我的欧拉问题解决方案的结果。


在下面的代码中,我创建了一个切片映射,在索引 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 停止尝试发送到这个通道。


慕雪6442864
浏览 134回答 2
2回答

千万里不及你

在您中,Euler2()您不检查通道是否已关闭。一旦关闭,它就会被解除阻塞,因此它会尝试向现在关闭的通道发送一个值。如果你只运行Euler2()你的程序可能会在你将值发送到关闭的通道之前退出。

函数式编程

在您的帮助下,我明白我以错误的方式关闭了频道。现在工作正常。func Euler2() int {&nbsp; &nbsp; c := make(chan int)&nbsp; &nbsp; done := make(chan bool)&nbsp; &nbsp; go numbers.FibonacciGen(c, done)&nbsp; &nbsp; sum := 0&nbsp; &nbsp; var f int&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; f = <-c&nbsp; &nbsp; &nbsp; &nbsp; if f < 4000000 {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if f%2 == 0 {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum += f&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; close(done)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return sum&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}func FibonacciGen(c chan int, done chan bool) {&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case <-done:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for i, j := 0, 1; ; i, j = i+j, i {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c <- i&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答