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

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

golang Selenium WebDriver 使用记录

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

golang snappy 的使用场合

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

Golang http IPv4/IPv6 服务

Golang 的网络服务,如果不指定IPv4 或 IPv6,如果VPS 同时支持 IPv4 和 IPv6,`net.Listen()` 只会监听 IPv6 地址。但这不影响客户端使用 IPv4 地址来访问。...

Golang 实现 10 进制转 N 进制

给定一个不没有重复字符的字符串,如 `[0-9,a-z]`,把一个 10 进制数字转为,该字符集的字符串。应用场合如汽车牌、顺序计数。...

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

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