https://songjiayang.gitbooks.io/go-basic-courses/content/ch6/error.html
本文档第二个例子,我试了一下,结果是 2,不是 4。本人版本go version go1.9.2 darwin/amd64
。
package main
import (
"fmt"
)
func testDefer() (i int) {
defer func() {
fmt.Println(i)
i = 4
}()
return 2
}
func main() {
testDefer()
}
1
happywowwow 2018-03-15 17:05:24 +08:00 1
你要输出 testDefer() 的返回值...
|
2
mmnnyycc OP @happywowwow 是的,谢谢
|
3
kuaner 2018-03-15 17:11:33 +08:00 1
func main() {
fmt.Println(testDefer()) } |
4
ylcc 2018-03-15 17:11:42 +08:00 1
2 是 fmt.Println(i)的值...
|
5
BBCCBB 2018-03-15 17:18:01 +08:00 1
楼上老哥说的对
fmt.Println(testDefer()) |
6
TanLian 2018-03-15 17:19:14 +08:00 2
看来你对 golang 的 return 没理解,golang 和 C、C++不同,golang 的 return 不是一个原子语句,在你这个例子中,
把 return 2 分成了两步,第一步是 i=2,第二步是 return i (注意是字母 i )。但由于 defer 的特性(这个不了解的话我也无能为力了),defer 是插在这两步中间的,所以实际上的执行过程是这样的, func testDefer() (i int) { i = 2 func() { fmt.Println(i) i = 4 }() return i } 所以会打印 2,testDefer 函数的返回值是 4,明白? 实际上这个题主要考察的是 return 和 defer,理解了这两个知识点,就不难理解为什么输出为 2 了。 另可关注我的公众号“大后端开发”,讲解了 golang 的很多这方面的知识。 |
9
TanLian 2018-03-15 20:47:31 +08:00
|
10
wweir 2018-03-16 06:31:00 +08:00 via Android
把 print 放到 main 里就是 4 了
|
11
archliinux 2018-03-16 10:53:45 +08:00 1
@TanLian 这种水平就不要出来开公众号误导人了
A defer statement pushes a function call onto a list. The list of saved calls is executed after the surrounding function returns. |
12
TanLian 2018-03-16 14:46:14 +08:00
@archliinux 不想和你争辩,公众号怎么你了?你牛逼怎么不见你分析,就在这喷别人
|
13
TanLian 2018-03-16 14:48:38 +08:00
@archliinux 公众号的每篇文章都是一个字一个字的码出来的好吗,如果你觉得某个知识点有错误,可以提出来我确定后会改。但是如果你看都没看的话就这这 BB,那么就恕不奉陪了。
|
14
nekoyaki 2018-03-16 17:54:47 +08:00
|
16
TanLian 2018-03-16 18:05:45 +08:00
@nekoyaki 看来你对 return 不理解,golang 的 return 本来就不是一个原子语句,这样解释没毛病,并且更利于他人理解,其他不想多说。
|
18
TanLian 2018-03-16 18:45:55 +08:00
@nekoyaki 呵呵,也许我的表达有问题吧。不过你可以参考这几篇文章,应该就能理解我说的了。
https://studygolang.com/articles/7548 https://www.golangtc.com/t/56667d4db09ecc6de0000025 https://tiancaiamao.gitbooks.io/go-internals/content/zh/03.4.html http://blog.csdn.net/hittata/article/details/77836435 我不敢保证这几篇文章的内容有价值,仅作参考,当然你也可以忽略。 另祝君安好。 |