GolangNote

Golang笔记

理解golang defer 的使用

Permalink

defer 是在函数退出前实行。另外需要注意的是函数的参数是值传递的。

看下面的例子:

Go: 值传参
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import "fmt"

func main() {
  var m int

  m = 10

  fmt.Println(m)
  defer Print(m)
  m = 20
}

func Print(m interface{}) {
  fmt.Println(m.(int))
}

输出的结果是:

Bash: out put
1
2
10
10

如果要输出20 就用指针作为函数参数,代码改为:

Go: 指针参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
  var m *int

  m = new(int)
  *m = 10

  fmt.Println(*m)
  defer Print(m)
  *m = 20
}

func Print(m interface{}) {
  fmt.Println(*m.(*int))
}

输出:

Bash: out put
1
2
10
20

也可以使用闭包函数更简单处理:

Go: 闭包函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
  var m int

  m = 10

  fmt.Println(m)

  // 可以用闭包函数,跟了一个匿名函数,就是闭包了,闭包相当于把指针准备好了.
  defer func() {
    fmt.Println(m)
  }()

  m = 20
}

输出

Bash: out put
1
2
10
20

用闭包还是指针,就看自己的需求了

本文网址: https://golangnote.com/topic/74.html 转摘请注明来源

Related articles

golang snappy 的使用场合

google 自家的 snappy 压缩优点是非常高的速度和合理的压缩率。压缩率比 gzip 小,CPU 占用小。...

golang Selenium WebDriver 使用记录

Selenium WebDriver 直接通过浏览器自动化的本地接口来调用浏览器,以达到模拟浏览器行为的操作,如点击、选择、鼠标移动等。下面是记录个人使用golang 驱动的记录。...

理解 golang defer 的实行

关键字 defer 用于注册延迟调用。这些调用直到 return 前才被执行,通常⽤用于释放资源或错误处理。...

Golang phantomjs 动态代理实现

phantomjs 是个很优秀的软件,虽然现在被chrome headless 抢了风头,但在某些特定场合,使用phantomjs 还是很方便,这里是介绍使用Go 实现动态代理。...

Write a Comment to "理解golang defer 的使用"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.22.3 Processed in 0ms