码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Go语言之return语句深入理解及defer、return的执行顺序


    一、一个函数中多个defer的执行顺序

    defer 的作用就是把defer关键字之后的函数执行压入一个栈中延迟执行,多个defer的执行顺序是后进先出LIFO,也就是先执行最后一个defer,最后执行第一个defer

    eg:

     输出:

    二、defer、return、返回值的执行返回值顺序

    在此之前,先理解一下return返回值的运行机制:return并非原子操作,共分为(1) 返回值赋值;(2) RET指令两步操作。而defer语句执行在赋值之后,RET之前。

    defer、return、返回值三者的执行是:return最先执行,先将结果写入返回值中(即赋值);接着defer开始执行一些收尾工作;最后函数携带当前返回值退出(即返回值)。

    1、不带命名返回值

    如果函数的返回值是无名的(不带命名返回值),则go语言会在执行return的时候会执行一个类似创建一个临时变量作为保存return值的动作。

    eg:

     输出:

    解释:

    如上例子,实际上一共执行了3步操作,

    1)赋值,因为返回值没有命名,所以return 默认指定了一个返回值(假设为s),首先将i赋值给s,i初始值是0,所以s也是0

    2)后续的defer操作因为是针对i,进行的,所以不会影响s, 此后因为s不会更新,所以s不会变还是0

    3)返回值,return s,也就是return 0
    相当于:
    var i int
    s := i
    return s

    2、有名返回值

    有名返回值的函数,由于返回值在函数定义的时候已经将该变量进行定义,在执行return的时候会先执行返回值保存操作,而后续的defer函数会改变这个返回值(虽然defer是在return之后执行的,但是由于使用的函数定义的变量,所以执行defer操作后对该变量的修改会影响到return的值。

    eg:

    输出:

    解释:

    s 就相当于命名的变量i,因为所有的操作都是基于命名变量i(s),返回值也是i,所以每一次defer操作,都会更新返回值,执行完defer后,会返回最终i的值。

    参考文章:

    go defer详解 - 测试开发喵 - 博客园

  • 相关阅读:
    LVGL使用GUI Guider配置STM32界面详细笔记教程
    【c语言】编译链接--详解
    【蓝桥杯Web】第十四届蓝桥杯(Web 应用开发)模拟赛 2 期 | 精品题解
    unity 射线检测,鼠标点击3D物体交互
    用户端APP自动化测试_L2
    R语言ggplot2可视化:使用ggplot2可视化散点图、使用scale_x_log10函数配置X轴的数值范围为对数坐标
    散热问题在DC电源模块设计中的重要性和解决方法
    黑马程序员2023新版JavaWeb企业开发全流程学习笔记(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)
    【附源码】计算机毕业设计SSM社区老人健康服务跟踪系统
    搜维尔科技:特斯拉称工厂内有两台人形机器人开始自主工作
  • 原文地址:https://blog.csdn.net/lovedingd/article/details/125898040
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号