Golang中defer、闭包以及命名返回值

defer 后面跟普通函数

package main

func main() {
    run()
}

func run() {
    name := "Paul"
    defer sayHello(name) 
    name = "John"
}

func sayHello(name string) {
    println("Hello " + name)
}
// Hello Paul 只是延缓执行,实参会按照正常顺序传入函数中

defer、return 和未命名的返回值

package main

func main() {
    name := run()
    println("return: name = " + name) 
}

func run() (string) {
    name := "Paul"
    defer sayHello(&name)
    name = "John"
    return name
}

func sayHello(name *string) {
    *name = "George"
    println("Hello " + *name)
}
//Hello John  虽然实参提前传入,但是传入的是一个指针,最后执行拿到的是经过修改过的值
//Hello George
//return: name = John  未命名返回值,所以 defer 无法对返回的值进行操作的

defer、return 和命名的返回值

package main

func main() {
    name := run()
    println("return: name = " + name) 

func run() (x string) {
    name := "Paul"
    x = name
    defer sayHello(&x) 
    name = "John"
    return name
}

func sayHello(name *string) {
    println("Hello " + *name)
    *name = "George"
    println("Hello " + *name)
}
//Hello John
//Hello George
//return: name = George 因为使用命名返回值,所 defer 里面依然可以对 defer 进行操作
package main

func main() {
    name := run()
    println("return: name = " + name) 

func run() (x string) {
    name := "Paul"
    x = name
    defer sayHello(x)
    name = "John"
    return name
}

func sayHello(name string) {
    println("Hello " + name)
    name = "George"
    println("Hello " + name)
}
//Hello Paul  延迟执行但是按照程序顺序执行,传入的实参为 Paul 
//Hello George 函数内修改对外面的值没有影响
//return: name = John 

defer 闭包函数

package main

func main() {
    name := run()
    println("return: name = " + name)
}

func run() (string) {
    name := "Paul"
    aFun := func() {
        println("Hello " + name)
        name = "George"
        println("Hello " + name)
    }
    name = "John"
    aFun()
    return name
}
//Hello John 虽然闭包定义时,外部变量 name = "Paul", 但是其实只是记录是一个指针,所以最后执行的时候 name = "John" 
//Hello George
//return: name = George
package main

func main() {
    name := run()
    println("return: name = " + name)
}

func run() (x string) {
    name := "Paul"
    aFun := func() {
        println("Hello " + x)
        x = "George"
        println("Hello " + x)
    }
    defer aFun()
    name = "John"
    return name
}
//Hello John 
//Hello George
//return: name = George  defer 对返回值进行了修改
package main

func main() {
    name := run()
    println("return: name = " + name)
}

func run() (x string) {
    name := "Paul"
    x = name
    aFun := func(x string) {
        println("Hello " + x)
        x = "George"
        println("Hello " + x)
    }
    defer aFun(x)
    name = "John"
    return name
}
//Hello Paul  实参按照顺序拷贝传入 x = "Paul"
//Hello George 
//return: name = John  因为设置了形参所以闭包内的对应的变量只是在局部生效,不会影响外部变量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,823评论 2 9
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,195评论 0 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,837评论 18 139
  • 部分内容尚未迁移过来,发帖占位。我们根据开课需要,不断从WORD、PPT、小视频、书籍、讲义等传统课件形式,向公共...
    张老师大语文阅读 211评论 0 0
  • 《醒来》 春天打马而来,在飞奔,在呼啸 不经意打翻了调色盘 原野泼辣辣醒来 刹那间就花满山岗 梦乡里懵懂的旅人 是...
    南雁1阅读 173评论 1 1