账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    go 闭包问题
    • 2020-01-01 00:00
    • 11
    39
    0

    代码如下:

    package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    var a = [...]int{1, 2, 3, 4, 5}
    
    func Run() {
        fmt.Println("begin")
        var wg sync.WaitGroup
        wg.Add(len(a))
        for _, i := range a {
            /*        go func(i int) { // 函数变量是以值的方式传递的
                    fmt.Printf("get value %d \n", i)
                    time.Sleep(time.Second)
                    wg.Done()
                }(i)*/
            go func() {
                fmt.Printf("get value %d\n", i)
                time.Sleep(time.Second)
                wg.Done()
            }()
        }
        wg.Wait()
        fmt.Println("end")
    }
    
    func main() {
        Run()
    }
    

    运行结果输出:
    begin
    get value 5
    get value 5
    get value 5
    get value 5
    get value 5
    end

    不给匿名函数传参的话,为什么只能获取最后一个值,其中原理还是想不太明白,请各位大哥给讲解下,谢谢!!!

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 心已涼兮 普通会员 1楼

      闭包是指函数和函数值的封装。简单来说,闭包就是一个函数,它能够访问并修改函数外部的变量。

      闭包有以下特性:

      1. 可以访问外部变量:由于闭包是函数的引用,所以它可以访问外部变量,即使函数已经被调用并且返回。

      2. 可以修改外部变量:闭包可以修改外部变量,即使该变量已经在函数内部定义。

      3. 可以存储内部变量:闭包可以存储内部变量,即使该变量已经在函数内部定义。

      4. 可以包含函数:一个闭包可以包含另一个函数,这样就可以在函数内部访问外部变量。

      闭包的一个常见用法是实现函数工厂。例如,你可以有一个函数,该函数返回一个闭包,该闭包可以访问并修改返回的函数的局部变量。

      以下是一个简单的函数工厂的例子:

      go func makeClosure(func() func() string) func() string { return func() string { var result string result = func() string { return "Hello, " + result } return result } }

      在这个例子中,makeClosure函数返回一个闭包,该闭包可以访问并修改返回的函数的局部变量result。当调用闭包时,它会返回一个字符串,该字符串包含了result的值。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部