golang之匿名函数结合defer

defer语句中的函数会在return语句更新返回值变量后再执行,又因为在函数中定义的匿名函数可以访问该函数包括返回值变量在内的所有变量,所以,对匿名函数采用defer机制,可以使其观察函数的返回值。

以double函数为例:

func double(x int) int {
  return x + x
}

我们只需要首先命名double的返回值,再增加defer语句,我们就可以在double每次被调用时,输出参数以及返回值。

func double(x int) (result int) {
  defer func() { fmt.Printf("double(%d) = %d\n", x,result) }()
  return x + x
}
_ = double(4)
// Output:
// "double(4) = 8"

可能doulbe函数过于简单,看不出这个小技巧的作用,但对于有许多return语句的函数而言,这个技巧很有用。

被延迟执行的匿名函数甚至可以修改函数返回给调用者的返回值:

func triple(x int) (result int) {
  defer func() { result += x }()
  return double(x)
}
fmt.Println(triple(4)) // "12"

在循环体中的defer语句需要特别注意,因为只有在函数执行完毕后,这些被延迟的函数才会执行。下面的代码会导致系统的文件描述符耗尽,因为在所有文件都被处理之前,没有文件会被关闭。

for _, filename := range filenames {
    f, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer f.Close() // NOTE: risky; could run out of file
    descriptors
    // ...process f…
}    

原文地址:https://www.cnblogs.com/xiangxiaolin/p/11992712.html

时间: 2024-08-29 09:36:20

golang之匿名函数结合defer的相关文章

匿名函数和defer

package main import "fmt" func main() { a := 10 b := 20 defer func() { fmt.Printf("a = %d, b = %d\n", a, b) }() a = 111 b = 222 fmt.Printf("a = %d, b = %d\n", a, b) } 执行后得到以下的结果,需要注意以下: 1.defer的匿名函数是在整个函数执行结束前的一瞬间执行的,即延时执行 2.

goLang(匿名函数)

go 匿名函数与其他语言基本上是无区别的,下面举个例子说明 package main import ( "fmt" ) func main() { a1,a2 := 1,2 rs := func(a int, b int) int { //()括号中是接受的参数 a1,a2 return a+b }(a1, a2) //() 括号中的是传入的参数 fmt.Println(rs) //调用匿名函数 结果输出3 //下面匿名函数不穿入参数,结果输出 rs2 func () { fmt.Pr

golang之匿名函数

1 package main 2 3 import "fmt" 4 5 /* squares返回一个匿名函数 6 * 该匿名函数每次调用返回下一个数的平方 7 * func name(parameter-list) (result-list) { 8 * body 9 * } 10 */ 11 12 func squares() func() int { 13 var x int 14 return func() int { 15 x++ 16 return x * x 17 } 18

Golang之匿名函数和闭包

Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用. 使用方法如下: main.go package main import ( "fmt" ) func main() { var v func(a int) int v = func(a int) int { return a * a } fmt.Println(v(6)) //两种写法 v1 := func(i int) int { return i * i } fmt.Println(v1(7)) } GO语言的匿名函数就

golang 函数二 (匿名函数和闭包)

匿名函数就是没有定义函数名称的函数.我们可以在函数内部定义匿名函数,也叫函数嵌套. 匿名函数可以直接被调用,也可以赋值给变量.作为参数或返回值.比如: func main(){     func(s string){     //直接被调用         println(s)     }("hello gopher!!!")     /*     func(s string){     //未被调用         println(s)     }     */ } func mai

go 匿名函数和闭包

匿名函数 1. 函数也是一种类型,因此可以定义作为一个函数类型的变量 package main import "fmt" // 函数作为参数 func add(a, b int) int { return a + b } func testfunc(a, b int, fun func(int, int) int) int { sum := fun(a, b) return sum } func main() { sum := testfunc(2, 3, add) fmt.Print

day05匿名函数,内置函数,二分法,递归,模块

yield作为表达式来使用的方式 #grep -rl 'python /root """ 查找root下文件中含有python的文件 """ import os def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwargs) next(g) return g return wrapper @init def search(target): while True: search

14.匿名函数和闭包

匿名函数和闭包 学习要点:1.匿名函数2.闭包 匿名函数就是没有名字的函数,闭包是可以访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础. 一.匿名函数 //普通函数function box(){ //函数名是box return 'Lee'; } //匿名函数function(){ //匿名函数,会报错,单独的匿名函数是无法运行的 return 'Lee';} //通过表达式自我执行(function box(){ //封装成表达式 alert('Lee');})(

匿名函数和闭包

匿名函数和闭包匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.一. 匿名函数//普通函数functionbox() { //函数名是 boxreturn'Lee';}//匿名函数function() { //匿名函数,会报错return'Lee';}//通过表达式自我执行(function box() { //封装成表达式alert('Lee');})(); //()表示执行函数,并且传参//把匿名函数赋值给变量var box = function() { //将匿名函数赋给