golang 文档里面函数闭包的一些疑问

OSC首席键客 发布于 2013/07/24 16:40
阅读 349
收藏 0

文档的例子如下:

package main


import "fmt"


func adder() func(int) int { //这里和平常函数声明不太一样啊!两个func关键字,函数名是adder()?
    sum := 0 //这个变量一定要初始化吗?好像是可以先声明,不赋初值,会有默认值0
    return func(x int) int {
        sum += x
        return sum
    }
}


func main() {
    pos, neg := adder(), adder() //这里两次调用adder(),那他们是同事指向同一个闭包还是分别是两个闭包的拷贝?
    for i := 0; i < 10; i++ {
        fmt.Println(
            pos(i),
            neg(-2*i)  

//最后是上面了,从这里的结果我猜上一个问题应该是两个变量pos和neg是指向的同一个闭包的不同拷贝,对吗?

//调用同一个闭包,里面的外部函数的变量就像是静态变量一样,会保存上次执行最后这个变量的值?
        )
    }
}

勿喷!谢谢各位的解答!


最后golang的闭包和js的闭包是一样的吗?

加载中
0
viney
viney

1、sum:=0

等价于

var sum int // 默认会赋初始值

2、pos, neg := adder(), adder()

是两个拷贝

pos, neg := adder(), adder()

两个函数赋值给两个变量,它们是互不干扰的。

分别是两个闭包的拷贝。


OSC首席键客
OSC首席键客
这样个不是和静态变量很相似了?
0
李察德-泰森
李察德-泰森
func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}
定义了一个名字为adder()的函数,函数的返回值是一个函数,返回的函数是有一个整型参数并返回一个整数的函数。
其他的就慢慢自己看吧。
好吧,有点绕。
OSC首席键客
OSC首席键客
你在这一说,我想起来了,golang是要在前面说明返回值的…… 我说这怎能这么怪……
0
viney
viney

引用来自“viney”的答案

1、sum:=0

等价于

var sum int // 默认会赋初始值

2、pos, neg := adder(), adder()

是两个拷贝

pos, neg := adder(), adder()

两个函数赋值给两个变量,它们是互不干扰的。

分别是两个闭包的拷贝。


这个不是静态变量,只能说是私有变量,函数私有。

你说的静态变量应该相当于Go中的全局变量。

返回顶部
顶部