指剑对天笑 2021-07-18 16:56 采纳率: 0%
浏览 8

golang基础问题


 type Slice []int
  func NewSlice() Slice {
     return make(Slice, 0)
      }

  func (s* Slice) Add(elem int) *Slice {
      *s = append(*s, elem)
      fmt.Print(elem)
      return s
      }

func main() {
     s := NewSlice()
      defer s.Add(1).Add(2)
     s.Add(3) 

这段代码返回的结果是 132,一直不明白为什么返回的是132,如果不加Add(2)就返回的是 31,加了后defer怎么就跑前面去执行的,一直没弄明白,
谁能开导开导我。。

  • 写回答

1条回答 默认 最新

  • ProblemTerminator Go领域优质创作者 2022-03-10 13:51
    关注

    你好,defer后如果是链式调用,执行Add(1)后,Add(2)被推入延迟调用堆栈并接着执行下一行,顺序是:s.Add(1)---s.Add(3)---.Add(2)
    如果没有.Add(2),则遇到defer会延迟执行,结果就是31
    比如再弄复杂点:
    defer s.Add(1).Add(2).Add(3)
    s.Add(4).Add(5)
    则结果就是12453
    如果换一种defer形态:defer func(){}()执行结果也会不一样哦
    推荐好文:https://lan6193.blog.csdn.net/article/details/116135025 特点讲的很清楚,你一看就懂
    如果有有帮助,欢迎采纳哦!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月18日

悬赏问题

  • ¥20 数学建模,尽量用matlab回答,论文格式
  • ¥15 昨天挂载了一下u盘,然后拔了
  • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
  • ¥20 易康econgnition精度验证
  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能