求助一个golang的闭包问题

这个是官方的例子,请教一下:
红色框的闭包函数的参数不像普通函数那样是给了名字的,是没有被命名的,蓝色框内的参数 x 自动被赋值了红色框内没有被命名的参数
不知道是不是这样,为什么要这么做 ?

共 3 个回复


stevewang

adder这个函数的返回类型是func(int) int,函数中返回了func(int) int类型的一个实例(闭包)。
所以你画的红框指明了adder函数的返回类型,蓝框是定义了一个符合adder函数返回类型的闭包,也就是adder函数的返回值。

# 0

wolfxiaozhai

红色框中的参数也可以给定一个随意的名字,无论有没有给定参数名,红色框都表示返回类型是有一个int型参数的func(int) int,而蓝色框处表示返回的闭包且需要使用其中的参数,每次调用时需要实例化此类型函数,此时蓝色框内x被赋值。

# 1

stevenldj

闭包把 sum 封闭在一个不可访问的地方,要想访问 sum,只能通过 adder 返回的函数去访问,这样可以限制对 sum 的访问方式,在你给的代码中,只能对 sum 进行 += 操作(限制),而不能进行乘除等其它操作。

// 定义 adder(),需要返回一个 func(int) int 类型的函数
func adder() func(int) int {
    sum := 0
    // 这里就返回了一个 func(int) int 类型的函数
    return func(x int) int {
        sum += x
        return sum
    }
}
# 2