doutang1884 2017-10-11 15:50
浏览 11
已采纳

推迟现场分配是竞争条件吗?

Consider the following code:

type foo struct {
  bar string
}

func f() *foo {
  ret := &foo{"before"}
  defer func() { ret.bar = "after" }()
  return ret
}

func main() {
  fmt.Println(f()) // prints "&{after}"
}

The motivation is having to return a struct but some of the fields need to be set only before returning (e.g. a timestamp of when the function completed).

Is deferring the field assignation a race condition? Is it idiomatic? Is there a better way?

  • 写回答

2条回答 默认 最新

  • dongtan7639 2017-10-11 18:21
    关注

    The main benefit of using defer statement versus invoking something before returning from a function or routine is defer will run the statement even when a panic occurs before returning.

    Thus it is commonly used to clean up resources (such as closing a file or network connection) rather than to set state.

    The function below will not print or return "hello"

    func f() string {
            panic("omg")
            fmt.Println("hello")
            return "hello"
    }
    

    This code will print but won't return "hello"

    func f() string {
            defer fmt.Println("ello")
            panic("omg")
            return "hello"
    }
    

    To answer your question: No, it won't result in a race. Apart from the above difference, it is equivalent to calling something before the return statement.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址