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 defer 的实行

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

golang Selenium WebDriver 使用记录

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

golang共享数据用Mutex 或 Channel

在go 里,多线程对共享数据的操作一般要使用Mutex 或 Channel 来加锁或隔离通信。下面是一个使用Mutex 和 Channel 比较的例子。...

groupcache 使用入门

groupcache 是 memcached 作者 Brad Fitzpatrick 用 Go 语言编写的缓存及缓存过滤库,作为 memcached 许多场景下的替代版本。...

Golang sync.WaitGroup 的 Wait 超时处理

sync.WaitGroup 使用 `Add(1)`、`Done()`、`Wait()`组合来实现多协程等待,如果某一协程未能合理处理错误,导致无法退出,此时需要引入超时机制。下面是一种超时处理方法。...

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

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