Below you will find pages that utilize the taxonomy term “Defer”
January 18, 2020
Golang中关于defer语句理解的一道题
"\u003ch2 id=\"示例\"\u003e示例\u003c/h2\u003e\n\u003cp\u003e我们先看一下源代码\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc f(n int) (r int) {\n\tdefer func() {\n\t\tr += n\n\t\trecover()\n\t}()\n\n\tvar fc func()\n\tdefer fc()\n\tfc = func() {\n\t\tr += 2\n\t}\n\n\treturn n + 1\n}\n\nfunc main() {\n\tfmt.Println(f(3))\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e大家感觉着打印的值是多少呢?5、9还是7?执行完以后发现是7。好像与多数理解的有些出入,为什么是7,而不是9呢。下面我们来分析一下。\u003c/p\u003e\n\u003ch2 id=\"问题分析\"\u003e问题分析\u003c/h2\u003e\n\u003cp\u003e对于defer执行的顺序是FIFO这一点都很清楚,我们只需要看搞懂f()函数的执行顺序就行了。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e执行顺序为:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e注册第1个defer 函数, 这里为匿名函数,函数体为 “func() { r += n recover() }()”,内部对应一个函数指针。这里延时函数所有相关的操作一步完成。\u003c/li\u003e\n\u003cli\u003e注册第2个defer函数,函数名为fc(),无函数体, 函数指针为\u003cstrong\u003enil\u003c/strong\u003e(也有可能指针不会空,但指针指向的内容非函数体 …\u003c/li\u003e\u003c/ol\u003e"