新手求助,go闭包

TemperShy · 2018-11-19 20:45:11 · 2660 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-11-19 20:45:11 的主题,其中的信息可能已经有所发展或是发生改变。

func test() func() string { s := "a" return func() string { return s+"a" } }

func test() func() string { s := "a" return func() string { s += "a" return s } } 为啥只有下面这个才是闭包


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2660 次点击  
加入收藏 微博
5 回复  |  直到 2018-11-22 13:11:17
Dust90
Dust90 · #1 · 6年之前
func test() func() string { 
    s := "a" 
    return func() string { 
        return s+"a" 
    } 
}

应该是所引用的变量s没有发生变化
可以参考这里:https://www.ibm.com/developerworks/cn/linux/l-cn-closure/index.html#note_3

Leigg
Leigg · #2 · 6年之前

你是通过什么判断第一个不是闭包的?

Leigg
Leigg · #3 · 6年之前

实现闭包的条件:
1、定义的函数返回了一个函数对象
2、且返回的这个函数引用了其作用域外部的变量(一般称自由变量,由主函数传入,但也可以是主函数内部 && 子函数外部作用域内定义的局部变量)
3、语言支持。
go是通过匿名函数支持的闭包,而你定义的两个函数都是符合前两个条件的,如何又来不是闭包一说?

chenph
chenph · #4 · 6年之前
package main

import (
    "fmt"
)

func test() func() string {
    s := "a"
    return func() string { return s + "a" }
}

func test2() func() string {
    s := "a"
    return func() string {
        s += "a"
        return s
    }
}

func main() {
    tmp := test()
    fmt.Println(tmp())
    fmt.Println(tmp())
    fmt.Println(tmp())

    tmp2 := test2()
    fmt.Println(tmp2())
    fmt.Println(tmp2())
    fmt.Println(tmp2())
}

输出:

aa
aa
aa
aa
aaa
aaaa

同意三楼

Banlangenn
Banlangenn · #5 · 6年之前

1也是闭包: 只是你没有用它作什么事! go的闭包和所有支持函数式变成的 闭包都是一样的

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传