每次学习并整理一个Golang的知识点,每天进步一点点。今天学习下defer预计算参数的一个知识点🤔

日省吾身

  1. 下面代码的输出结果?
1
2
3
4
5
6
7
8
9
func hello(n int) {
	fmt.Println(n)
}

func main() {
	n := 5
	defer hello(n)
	n = n + 10
}

思考后看答案

思考后看下方答案…


答疑解惑

参考答案:

输出结果:5 知识点:defer

  • Go 语言的 defer 会在当前函数或者方法返回之前执行传入的函数。它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。
  • 调用 defer 关键字会立刻对函数中引用的外部参数进行拷贝,所以hello(n)的结果不是在 main 函数退出之前计算的,而是在 defer 关键字调用时计算的;
  • 这个例子中,hello() 函数的参数在执行 defer 语句的时候会保存一份n的副本,在实际调用 hello() 函数时使用,所以输出结果是:5

以上,你做对了吗?😊

其他相关答案或补充知识点,欢迎在评论区留言补充!

扩展阅读

对于上述问题,如果想把n+10的值传入到hello()函数中,该怎么办呢?

其实也很简单,我们只需要向 defer 关键字传入匿名函数即可,例如:

1
2
3
4
5
func main() {
	n := 5
	defer func() { hello(n) }()
	n = n + 10
}

上面的输出结果为: 15

虽然调用 defer 关键字时也使用值传递,但是因为拷贝的是函数指针,所以 hello(n) 会在 main 函数返回前被调用并打印出符合预期的结果;

下期提问

1.下面代码的输出结果是?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func main() {
	var l1 []int
	var l2 = []int{}
	switch {
	case l1 == nil:
		fmt.Println("l1 is nil")
	case l2 == nil:
		fmt.Println("l2 is nil")
	}
}
  • A. l1 is nil
  • B. l2 is nil
  • C. compilation error

2.下面代码的输出结果是?

1
2
3
4
5
func main() {
	n := 66
	fmt.Println(string(n))
}

  • A. B
  • B. 66
  • C. compilation error

答案及解析将在下期文章中给出,欢迎大家在评论区写出你的答案;独乐乐不如众乐乐,交流学习,互相进步


欢迎转发和评论。更多优质原创文章,欢迎关注微信公众号“IYue爱月”或扫描下方二维码:

xujpxm_qrcode_gh