go的context的Done 源码函数
```
func (c *cancelCtx) Done() <-chan struct{} {
c.mu.Lock()
if c.done == nil {
c.done = make(chan struct{})
}
d := c.done
c.mu.Unlock()
return d
}
```
把末尾的三行代码替换成下面
```
defer c.mu.Unlock()
return c.done
```
请问大家,这两种写法有否是有差异呢?源码为什么要新建个变量再返回呢
更多评论
`defer`再怎么也得有一定开销吧,而且是在`return`之后才执行`defer`
我看最新版也用了`defer`
```go
func (c *cancelCtx) Done() <-chan struct{} {
d := c.done.Load()
if d != nil {
return d.(chan struct{})
}
c.mu.Lock()
defer c.mu.Unlock()
d = c.done.Load()
if d == nil {
d = make(chan struct{})
c.done.Store(d)
}
return d.(chan struct{})
}
```
#1