go - 直接调用函数和使用指针之间的不同行为

标签 go

我是 Go 语言的新手,对以下代码感到困惑

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    previous := 0
    current := 1
    return func () int{
        current = current+previous
        previous = current-previous
        return current

    }
}

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

这段代码应该打印出斐波那契数列(前 10 个),但只打印了 10 次 1。 但如果我将代码更改为:

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

然后它工作正常。输出是斐波那契数列。

谁能帮我解释一下?

谢谢

最佳答案

fibonacci() 创建一个新的斐波那契生成器函数。 fibonacci()() 做同样的事情,然后调用它一次,返回结果并丢弃生成器,永远不会再次使用。如果您在循环中调用它,它只会继续创建新的生成器并且只使用它们的第一个值。

如果您想要的不仅仅是第一个值,则需要完全按照您在第二个示例中所做的操作。将生成器本身存储在一个变量中,然后多次调用同一个生成器。

关于go - 直接调用函数和使用指针之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19260006/

相关文章:

pointers - Go中的指针困惑

hex - 在 Go 中将 strconv 用于负十六进制值

go - 在 Go 中声明类型时的方法歧义

pointers - 如何设计具有可修改字段的结构?

javascript - 使用Go读取用于javascript渲染的文件

go - 具有组合声明/赋值运算符的全局变量内联赋值和另一个未声明的变量失去范围?

python - 将 Python 解析为 Golang - DateTime

戈朗 : why following code snippet do not write to file?

regex - guid 的正则表达式

go - 如何将 []byte 解码为 json 结构,该结构作为值存储在字符串类型的变量中?