指剑对天笑 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 优质创作者: 后端开发技术领域 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日