当前位置: 首页 > news >正文

兄弟连php网站开发打广告推广怎么做

兄弟连php网站开发,打广告推广怎么做,做网站店铺装修的软件,网页微信版客户端defer关键字 defer和go一样都是Go语言提供的关键字。defer用于资源的释放,会在函数返回之前进行调用。一般采用如下模式: f,err : os.Open(filename) if err ! nil {panic(err) } defer f.Close()如果有多个defer表达式,调用顺序类似于栈&a…

defer关键字

defer和go一样都是Go语言提供的关键字。defer用于资源的释放,会在函数返回之前进行调用。一般采用如下模式:

f,err := os.Open(filename)
if err != nil {panic(err)
}
defer f.Close()

如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。

不过如果对defer的了解不够深入,使用起来可能会踩到一些坑,尤其是跟带命名的返回参数一起使用时。在讲解defer的实现之前先看一看使用defer容易遇到的问题。

defer使用时的坑

先来看看几个例子。例1:

func f() (result int) {defer func() {result++}()return 0
}

例2:

func f() (r int) {t := 5defer func() {t = t + 5}()return t
}

例3:

func f() (r int) {defer func(r int) {r = r + 5}(r)return 1
}

请读者先不要运行代码,在心里跑一遍结果,然后去验证。

例1的正确答案不是0,例2的正确答案不是10,如果例3的正确答案不是6......

defer是在return之前执行的。这个在 官方文档中是明确说明了的。要使用defer时不踩坑,最重要的一点就是要明白,return xxx这一条语句并不是一条原子指令!

函数返回的过程是这样的:

        先给返回值赋值,然后调用defer表达式,最后才是返回到调用函数中。

defer表达式可能会在设置函数返回值之后,在返回到调用函数之前,修改返回值,使最终的函数返回值与你想象的不一致。

其实使用defer时,用一个简单的转换规则改写一下,就不会迷糊了。改写规则是将return语句拆成两句写,return xxx会被改写成:

返回值 = xxx
调用defer函数
空的return

先看例1,它可以改写成这样:

func f() (result int) {result = 0  //return语句不是一条原子调用,return xxx其实是赋值+ret指令func() { //defer被插入到return之前执行,也就是赋返回值和ret指令之间result++}()return
}

所以这个返回值是1。

再看例2,它可以改写成这样:

func f() (r int) {t := 5r = t //赋值指令func() {        //defer被插入到赋值与返回之间执行,这个例子中返回值r没被修改过t = t + 5}return        //空的return指令
}

所以这个的结果是5。

最后看例3,它改写后变成:

func f() (r int) {r = 1  //给返回值赋值func(r int) {        //这里改的r是传值传进去的r,不会改变要返回的那个r值r = r + 5}(r)return        //空的return
}

所以这个例子的结果是1。

defer确实是在return之前调用的。但表现形式上却可能不像。本质原因是return xxx语句并不是一条原子指令,defer被插入到了赋值 与 ret之间,因此可能有机会改变最终的返回值。

defer的实现

defer关键字的实现跟go关键字很类似,不同的是它调用的是runtime.deferproc而不是runtime.newproc。

在defer出现的地方,插入了指令call runtime.deferproc,然后在函数返回之前的地方,插入指令call runtime.deferreturn。

普通的函数返回时,汇编代码类似:

add xx SP
return

如果其中包含了defer语句,则汇编代码是:

call runtime.deferreturn,
add xx SP
return

goroutine的控制结构中,有一张表记录defer,调用runtime.deferproc时会将需要defer的表达式记录在表中,而在调用runtime.deferreturn的时候,则会依次从defer表中出栈并执行。

http://www.ds6.com.cn/news/117686.html

相关文章:

  • 新站网站推广该如何做海口网站建设
  • 做网站可以用什么数据库长春网站制作公司
  • 网络营销实训报告seo排名关键词
  • 摄影网站建设内容软文内容
  • 网站创建设计SEO优化象客网站的推广方案的内容有哪些
  • 安徽六安有什么好玩的景点搜索引擎优化排名
  • 哪个网站可以发宝贝链接做宣传站长之家网站
  • python做网站视频教程今日特大新闻
  • 政府网站建设管理规范十大经典案例
  • 做外贸一般总浏览的网站百度置顶广告多少钱
  • 商贸营销型网站案例赣州seo排名
  • 网站传不上图片app搜索优化
  • 栾城网站制作seo渠道是什么意思
  • 互联网网站建设水平百度网盘网页版登录入口
  • 网站建设常用字体竞价排名服务
  • 企业 cms快速排名生客seo
  • 2019年新电商法做网站百度推广官网网站
  • 建设银行可以查房贷的网站营销宣传方式有哪些
  • wordpress 小说站主题贵州seo和网络推广
  • 必须在当地网站备案北京seo加盟
  • 有趣的网站大全优秀的网页设计案例
  • 电商个人网站建设百度seo搜索引擎优化方案
  • 茶叶网站策划书互联网搜索引擎
  • 工作服定做厂家西安seo服务商
  • 沈阳大十字街附近做网站公司互动营销是什么意思
  • 广告网站设计公司好吗百度广告点击软件
  • 万年历网站做推广普通话奋进新征程手抄报
  • ui设计学徒骗局网站推广优化平台
  • 博物馆网站制作手机推广app
  • 提供网站建设工具的品牌有哪些电商seo是什么