Go - 声明并且没有使用错误,当我认为我已经对变量这样做了

时间:2013-02-16 00:52:38

标签: go

这段代码出了什么问题?

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    prev := 0
    curr := 1
    return func() int {
        temp := curr
        curr := curr + prev
        prev := temp
        return curr
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

prog.go:13:已声明并未使用

2 个答案:

答案 0 :(得分:14)

您声明了一个名为prev的变量,然后从未使用它。

具体来说,你说prev := temp。这是在名为prev的当前作用域中创建一个新的局部变量。我假设您只想说prev = temp,它会修改从周围范围继承的prev变量。同样,您可能想在前一行中说curr = curr + prev,而不是使用:=

答案 1 :(得分:2)

如果您进行Kevin Ballard建议的更改,则

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    prev := 0
    curr := 1
    return func() int {
        temp := curr
        curr = curr + prev
        prev = temp
        return curr
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

输出:

1
2
3
5
8
13
21
34
55
89

输出不是Fibonacci sequence

对于Fibonacci sequence

package main

import "fmt"

func fibonacci() func() int {
    a, b := 0, 1
    return func() (f int) {
        f, a, b = a, b, a+b
        return
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

输出:

0
1
1
2
3
5
8
13
21
34