2013-02-16 37 views
7

这个代码有什么问题?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

而不是“有什么不对的代码”,你可能是指问(更具体地说)“为什么这个代码产生此编译器错误“, 对?请在将来提问时尽可能具体。 :) – Kissaki 2013-02-16 13:19:54

回答

13

你宣布一个名为prev变量,然后从来没有使用过。

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

+9

详细说明,'='将权限赋给左边,而':='创建一个名为左边的* new *变量,并为其赋予右边项目的值。 – Kitsune 2013-02-16 01:05:28

+0

谢谢!非常有意义。 – 2013-02-16 14:51:32

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 
+1

要添加一点点,你也可以用'curr + = prev'来代替'curr = curr + prev'。当然没有功能上的差别 - 按键少一点。 – 2013-02-16 04:50:50

+2

尽管您修复了代码并为该程序的表面上想要的功能提供了程序代码建议,但您没有回答实际问题*代码有什么问题* /“为什么会产生该编译器错误”。这就是为什么我仍然会投下它,尽管它可能在更广泛的范围内有用(它不适合这种Q/A格式)。 – Kissaki 2013-02-16 13:16:59

+0

我同意,实际上我的意图是放弃序列的前两个数字;我只是想测试关闭。 不过,这可能对一些读者有所帮助。 – 2013-02-16 14:52:49

相关问题