登录
首页 >  Golang >  Go问答

深入探讨 Go 函数闭包

来源:stackoverflow

时间:2024-03-07 17:54:27 418浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《深入探讨 Go 函数闭包》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

下面是go之旅函数闭包的代码,我对函数闭包了解一点,但我是go初学者。

package main

import "fmt"

func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}

func main() {
    pos, neg := adder(), adder()
    for i := 0; i < 10; i++ {
        fmt.Println(
            pos(i),
            neg(-2*i),
        )
    }
}

以下是问题:

  1. 对于 func adder() func(int) int { [参数列表][return_types] 分别是什么?
  2. 对于问题1的同一行,为什么有(int),而不是类似(x int)
  3. 对于pos,neg := adder(), adder(),是否意味着将函数adder分配给posneg,为什么不应该是 pos, neg := adder, adder

正确答案


问:对于 func adder() func(int) int { ,[参数列表]和[return_types]分别是什么?

答:这里,我们有一个名为 adder() 的函数,它不带参数,返回一个函数 func(int) int,它接受一个整数并返回一个整数。

问:与问题1相同的行,为什么有(int),而不是类似(x int)

答:这是 adder() 函数

func adder() func(int) int {
    sum := 0
    return func(x int) int {
        sum += x
        return sum
    }
}

看一下正在返回的函数,这里 func(x int) int 已经有一个命名参数 (x),所以我们不需要在 func adder() func(int) int 中再次提及它,因为如果我们执行类似 func adder() func(x int) int 的操作,则这里的 x 没有用处。

因此,如果返回的函数有 2 个参数(一个额外参数是 string 类型),那么它将类似于以下代码:

func adder() func(int, string) int {
    sum := 0
    return func(x int, y string) int {
        sum += x
        fmt.Println(y)
        return sum
    }
}

请注意,我们在 func adder() func(int, string) int { 处添加了 string 类型,这是因为我们返回的函数采用 string 类型。

问:对于 pos, neg := adder(), adder(),是否意味着将函数 adder 赋给 pos 和 neg,为什么不应该是 pos, neg := adder, adder?

a:看,当我们将 pos 赋值给 adder() 时(pos := adder()),pos 就变成了一个新函数,因为 adder() 返回了一个函数 func(int) int,因此我们可以做pos(i)

neg 也是如此。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>