Matthew H
Matthew H

Reputation: 5879

Go — declared and not used error, when I think I have done so to the variable

What's wrong with this code?

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: prev declared and not used

Upvotes: 8

Views: 2437

Answers (2)

peterSO
peterSO

Reputation: 166569

If you make the changes suggested by Kevin Ballard, then,

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())
    }
}

Output:

1
2
3
5
8
13
21
34
55
89

The output is not the Fibonacci sequence.

For the 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())
    }
}

Output:

0
1
1
2
3
5
8
13
21
34

Upvotes: 3

Lily Ballard
Lily Ballard

Reputation: 185681

You declared a variable named prev and then never used it.

Specifically, you said prev := temp. This is creating a new local variable in the current scope named prev. I assume you meant to just say prev = temp, which modifies the prev variable inherited from the surrounding scope. Similarly you probably meant to say curr = curr + prev on the previous line, instead of using :=.

Upvotes: 16

Related Questions