[{"data":1,"prerenderedAt":637},["ShallowReactive",2],{"content:\u002F2025\u002F09\u002Fgo-defer":3,"surround:\u002F2025\u002F09\u002Fgo-defer":626},{"id":4,"title":5,"body":6,"categories":605,"date":607,"description":608,"draft":609,"extension":610,"image":611,"meta":612,"navigation":97,"path":614,"permalink":611,"published":611,"readingTime":615,"recommend":611,"references":611,"seo":620,"sitemap":621,"stem":622,"tags":623,"type":624,"updated":607,"__hash__":625},"content\u002Fposts\u002F2025\u002F09\u002Fgo-defer.md","Go Defer 执行机制详解",{"type":7,"value":8,"toc":602},"minimark",[9,27,32,42,67,70,533,536,554,558,561,564,575,578,592,595,598],[10,11,12,13,17,18,22,23,26],"p",{},"我们都知道，",[14,15,16],"code",{"code":16},"defer","往往在函数的最后执行，遵循",[19,20,21],"strong",{},"先进后出","原则，在",[14,24,25],{"code":25},"return","函数写入返回值后执行，而且传入的形参会立即读入，后续修改对其无影响",[10,28,29],{},[19,30,31],{},"Go 函数返回过程完整流程",[10,33,34,35,37,38,41],{},"当一个函数执行到 ",[14,36,25],{"code":25}," 语句时，",[19,39,40],{},"执行顺序是","：",[43,44,45,55,61],"ol",{},[46,47,48,54],"li",{},[19,49,50,51,53],{},"计算 ",[14,52,25],{"code":25}," 后的表达式","（如果有的话），将结果赋值给返回值；",[46,56,57,60],{},[19,58,59],{},"执行所有的 defer 语句","（按照后进先出 LIFO 的顺序）；",[46,62,63,66],{},[19,64,65],{},"函数真正返回（携带返回值）","。",[10,68,69],{},"下面来看这三个案例",[71,72,77],"pre",{"className":73,"code":74,"language":75,"meta":76,"style":76},"language-go shiki shiki-themes github-light github-dark","package main\n\nimport \"fmt\"\n\nfunc Func1() int {\n\ta := 0\n\tdefer func() {\n\t\ta++\n\t}()\n\treturn a\n}\n\nfunc Func2() (a int) {\n\ta = 0\n\tdefer func() {\n\t\ta++\n\t}()\n\treturn\n}\n\nfunc Func3() *int {\n\ta := new(int)\n\t*a = 0\n\tdefer func() {\n\t\t*a++\n\t}()\n\treturn a\n}\n\nfunc main() {\n\tfmt.Println(Func1())\n\tfmt.Println(Func2())\n\tfmt.Println(*Func3())\n}\n","go","",[14,78,79,92,99,115,120,148,165,184,197,212,222,228,233,261,273,290,301,314,322,327,332,353,371,385,402,415,428,437,442,447,463,486,506,528],{"__ignoreMap":76},[80,81,84,88],"span",{"class":82,"data-line":83,"line":83},"line",1,[80,85,87],{"class":86},"szBVR","package",[80,89,91],{"class":90},"sScJk"," main\n",[80,93,95],{"class":82,"data-line":94,"line":94},2,[80,96,98],{"emptyLinePlaceholder":97},true,"\n",[80,100,102,105,109,112],{"class":82,"data-line":101,"line":101},3,[80,103,104],{"class":86},"import",[80,106,108],{"class":107},"sZZnC"," \"",[80,110,111],{"class":90},"fmt",[80,113,114],{"class":107},"\"\n",[80,116,118],{"class":82,"data-line":117,"line":117},4,[80,119,98],{"emptyLinePlaceholder":97},[80,121,123,126,129,133,136,140,143,145],{"class":82,"data-line":122,"line":122},5,[80,124,125],{"class":86},"func",[80,127,128],{"class":90}," Func1",[80,130,132],{"class":131},"sSDpw","(",[80,134,135],{"class":131},")",[80,137,139],{"class":138},"sVt8B"," ",[80,141,142],{"class":86},"int",[80,144,139],{"class":138},[80,146,147],{"class":131},"{\n",[80,149,151,155,158,161],{"class":82,"data-line":150,"line":150},6,[80,152,154],{"class":153},"indent","\t",[80,156,157],{"class":138},"a ",[80,159,160],{"class":86},":=",[80,162,164],{"class":163},"sj4cs"," 0\n",[80,166,168,170,172,175,178,180,182],{"class":82,"data-line":167,"line":167},7,[80,169,154],{"class":153},[80,171,16],{"class":86},[80,173,174],{"class":86}," func",[80,176,132],{"class":177},"sJX2D",[80,179,135],{"class":177},[80,181,139],{"class":138},[80,183,147],{"class":177},[80,185,187,189,191,194],{"class":82,"data-line":186,"line":186},8,[80,188,154],{"class":153},[80,190,154],{"class":153},[80,192,193],{"class":138},"a",[80,195,196],{"class":86},"++\n",[80,198,200,202,204,207,209],{"class":82,"data-line":199,"line":199},9,[80,201,154],{"class":153},[80,203,76],{"class":138},[80,205,206],{"class":177},"}",[80,208,132],{"class":177},[80,210,211],{"class":177},")\n",[80,213,215,217,219],{"class":82,"data-line":214,"line":214},10,[80,216,154],{"class":153},[80,218,25],{"class":86},[80,220,221],{"class":138}," a\n",[80,223,225],{"class":82,"data-line":224,"line":224},11,[80,226,227],{"class":131},"}\n",[80,229,231],{"class":82,"data-line":230,"line":230},12,[80,232,98],{"emptyLinePlaceholder":97},[80,234,236,238,241,243,245,247,249,252,255,257,259],{"class":82,"data-line":235,"line":235},13,[80,237,125],{"class":86},[80,239,240],{"class":90}," Func2",[80,242,132],{"class":131},[80,244,135],{"class":131},[80,246,139],{"class":138},[80,248,132],{"class":131},[80,250,193],{"class":251},"s4XuR",[80,253,254],{"class":86}," int",[80,256,135],{"class":131},[80,258,139],{"class":138},[80,260,147],{"class":131},[80,262,264,266,268,271],{"class":82,"data-line":263,"line":263},14,[80,265,154],{"class":153},[80,267,157],{"class":138},[80,269,270],{"class":86},"=",[80,272,164],{"class":163},[80,274,276,278,280,282,284,286,288],{"class":82,"data-line":275,"line":275},15,[80,277,154],{"class":153},[80,279,16],{"class":86},[80,281,174],{"class":86},[80,283,132],{"class":177},[80,285,135],{"class":177},[80,287,139],{"class":138},[80,289,147],{"class":177},[80,291,293,295,297,299],{"class":82,"data-line":292,"line":292},16,[80,294,154],{"class":153},[80,296,154],{"class":153},[80,298,193],{"class":138},[80,300,196],{"class":86},[80,302,304,306,308,310,312],{"class":82,"data-line":303,"line":303},17,[80,305,154],{"class":153},[80,307,76],{"class":138},[80,309,206],{"class":177},[80,311,132],{"class":177},[80,313,211],{"class":177},[80,315,317,319],{"class":82,"data-line":316,"line":316},18,[80,318,154],{"class":153},[80,320,321],{"class":86},"return\n",[80,323,325],{"class":82,"data-line":324,"line":324},19,[80,326,227],{"class":131},[80,328,330],{"class":82,"data-line":329,"line":329},20,[80,331,98],{"emptyLinePlaceholder":97},[80,333,335,337,340,342,344,346,349,351],{"class":82,"data-line":334,"line":334},21,[80,336,125],{"class":86},[80,338,339],{"class":90}," Func3",[80,341,132],{"class":131},[80,343,135],{"class":131},[80,345,139],{"class":138},[80,347,348],{"class":86},"*int",[80,350,139],{"class":138},[80,352,147],{"class":131},[80,354,356,358,360,362,365,367,369],{"class":82,"data-line":355,"line":355},22,[80,357,154],{"class":153},[80,359,157],{"class":138},[80,361,160],{"class":86},[80,363,364],{"class":90}," new",[80,366,132],{"class":177},[80,368,142],{"class":86},[80,370,211],{"class":177},[80,372,374,376,379,381,383],{"class":82,"data-line":373,"line":373},23,[80,375,154],{"class":153},[80,377,378],{"class":86},"*",[80,380,157],{"class":138},[80,382,270],{"class":86},[80,384,164],{"class":163},[80,386,388,390,392,394,396,398,400],{"class":82,"data-line":387,"line":387},24,[80,389,154],{"class":153},[80,391,16],{"class":86},[80,393,174],{"class":86},[80,395,132],{"class":177},[80,397,135],{"class":177},[80,399,139],{"class":138},[80,401,147],{"class":177},[80,403,405,407,409,411,413],{"class":82,"data-line":404,"line":404},25,[80,406,154],{"class":153},[80,408,154],{"class":153},[80,410,378],{"class":86},[80,412,193],{"class":138},[80,414,196],{"class":86},[80,416,418,420,422,424,426],{"class":82,"data-line":417,"line":417},26,[80,419,154],{"class":153},[80,421,76],{"class":138},[80,423,206],{"class":177},[80,425,132],{"class":177},[80,427,211],{"class":177},[80,429,431,433,435],{"class":82,"data-line":430,"line":430},27,[80,432,154],{"class":153},[80,434,25],{"class":86},[80,436,221],{"class":138},[80,438,440],{"class":82,"data-line":439,"line":439},28,[80,441,227],{"class":131},[80,443,445],{"class":82,"data-line":444,"line":444},29,[80,446,98],{"emptyLinePlaceholder":97},[80,448,450,452,455,457,459,461],{"class":82,"data-line":449,"line":449},30,[80,451,125],{"class":86},[80,453,454],{"class":90}," main",[80,456,132],{"class":131},[80,458,135],{"class":131},[80,460,139],{"class":138},[80,462,147],{"class":131},[80,464,466,468,471,474,476,479,482,484],{"class":82,"data-line":465,"line":465},31,[80,467,154],{"class":153},[80,469,470],{"class":138},"fmt.",[80,472,473],{"class":90},"Println",[80,475,132],{"class":177},[80,477,478],{"class":90},"Func1",[80,480,132],{"class":481},"sqkie",[80,483,135],{"class":481},[80,485,211],{"class":177},[80,487,489,491,493,495,497,500,502,504],{"class":82,"data-line":488,"line":488},32,[80,490,154],{"class":153},[80,492,470],{"class":138},[80,494,473],{"class":90},[80,496,132],{"class":177},[80,498,499],{"class":90},"Func2",[80,501,132],{"class":481},[80,503,135],{"class":481},[80,505,211],{"class":177},[80,507,509,511,513,515,517,519,522,524,526],{"class":82,"data-line":508,"line":508},33,[80,510,154],{"class":153},[80,512,470],{"class":138},[80,514,473],{"class":90},[80,516,132],{"class":177},[80,518,378],{"class":86},[80,520,521],{"class":90},"Func3",[80,523,132],{"class":481},[80,525,135],{"class":481},[80,527,211],{"class":177},[80,529,531],{"class":82,"data-line":530,"line":530},34,[80,532,227],{"class":131},[10,534,535],{},"输出结果为",[71,537,541],{"className":538,"code":539,"language":540,"meta":76,"style":76},"language-bash shiki shiki-themes github-light github-dark","0 1 1\n","bash",[14,542,543],{"__ignoreMap":76},[80,544,545,548,551],{"class":82,"data-line":83,"line":83},[80,546,547],{"class":90},"0",[80,549,550],{"class":163}," 1",[80,552,553],{"class":163}," 1\n",[555,556,557],"h2",{"id":557},"案例分析",[10,559,560],{},"这三个究竟有什么区别呢？",[10,562,563],{},"案例一：",[43,565,566,569,572],{},[46,567,568],{},"首先，我们获得a的值0，然后会重新赋值一份给临时的返回槽(slot)当中",[46,570,571],{},"然后，调用defer，修改局部变量a为1，但是a已被copy一份到返回槽，所以重新赋值没有用",[46,573,574],{},"返回0",[10,576,577],{},"案例二：",[43,579,580,583,586,589],{},[46,581,582],{},"首先，Go 在函数进入时会自动为 a 分配内存（在栈上，必要时会逃逸到堆）；",[46,584,585],{},"a的初始值0，然后赋值一份给临时的返回槽(slot)当中",[46,587,588],{},"然后defer修改了a的值",[46,590,591],{},"返回1",[10,593,594],{},"案例三:",[10,596,597],{},"与案例一相似，但是传递的是指针，是引用类型，能修改地址中存储的值，所以返回的是1",[599,600,601],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":76,"searchDepth":117,"depth":117,"links":603},[604],{"id":557,"depth":94,"text":557},[606],"Go语言","2025-09-30","本文讲述 Go 函数返回值与 defer 执行顺序的关系，通过三个实例分析值类型、具名返回值及引用类型在返回过程中的不同表现。",false,"md",null,{"slots":613},{},"\u002F2025\u002F09\u002Fgo-defer",{"text":616,"minutes":617,"time":618,"words":619},"2 min read",1.99,119400,398,{"title":5,"description":608},{"loc":614},"posts\u002F2025\u002F09\u002Fgo-defer",[75,16],"tech","Ayv4hw-wk-unQtcbh_yNE8ypnhaN-WUFT2SSj3L97FM",[627,632],{"title":628,"path":629,"stem":630,"date":631,"type":624,"children":-1},"Go 接入腾讯云短信服务","\u002F2025\u002F09\u002Ftecent-sms-send","posts\u002F2025\u002F09\u002Ftecent-sms-send","2025-09-28",{"title":633,"path":634,"stem":635,"date":636,"type":624,"children":-1},"kratos中proto文件引入其他proto爆红","\u002F2025\u002F10\u002Fkratos-proto-error","posts\u002F2025\u002F10\u002Fkratos-proto-error","2025-10-25",1786555055077]