zoukankan      html  css  js  c++  java
  • go defer、return的执行顺序

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

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

    eg:

     输出:

     

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

    在此之前,先理解一下return返回值的运行机制:return并非原子操作,共分为赋值、返回值两步操作。

    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的值。

     

    三、defer详解

    https://www.cnblogs.com/l199616j/p/15500696.html

     

    作者:十八岁

    -------------------------------------------

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    poj 1655 Balancing Act 树的重心
    poj 1985 Cow Marathon 树的直径
    hdu 4607 Park Visit 求树的直径
    hdu 1548 A strange lift 宽搜bfs+优先队列
    poj 2711 Leapin' Lizards && BZOJ 1066: [SCOI2007]蜥蜴 最大流
    poj 2449 Remmarguts' Date K短路+A*
    hdu 1285 确定比赛名次 拓扑排序
    hdu 3061 Battle 最大权闭合图
    hdu 3879 Base Station 最大权闭合图
    poj 2987 Firing 最大权闭合图
  • 原文地址:https://www.cnblogs.com/l199616j/p/15500631.html
Copyright © 2011-2022 走看看