我下面有这个简单的程序
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
wg.Add(1)
go func() {
fmt.Println("starting...")
time.Sleep(1 * time.Second)
fmt.Println("done....")
wg.Done()
} ()
wg.Wait()
}
请注意,我使用的var wg sync.WaitGroup
是值,而不是指针。但是sync包的页面指定Add
,Done
和Wait
函数采用*sync.WaitGroup
。
为什么/如何运作?
的设定方法的sync.WaitGroup
是空的方法集:
wg := sync.WaitGroup{}
fmt.Println(reflect.TypeOf(wg).NumMethod())
输出(在Go Playground上尝试):
0
这是因为所有方法都sync.WaitGroup
具有指针接收器,因此它们都是该*sync.WaitGroup
类型的方法集的一部分。
当您这样做时:
var wg sync.WaitGroup
wg.Add(1)
wg.Done()
// etc.
这实际上是的简写(&wg).Add(1)
,(&wg).Done()
等等。
这是在规范中:致电:
如果
x
是可寻址且&x
方法集包含m
,x.m()
则为的简写(&x).m()
。
因此,当您拥有一个可寻址的值(变量是可寻址的)时,您可以调用在非指针值上具有指针接收器的任何方法,并且编译器将自动获取该地址并将其用作接收器值。
问题内容: 我正在研究并发的Go库,偶然发现了goroutine之间两种相似的同步模式,其结果相似: 使用等待组 使用频道 有人告诉我,它的性能要好一些,而且我已经看到它被普遍使用。但是,我发现频道更惯用了。通过渠道使用的真正优势是什么?和/或更好的情况又可能是什么情况? 问题答案: 独立于第二个示例的正确性(如注释中所述,您没有按照自己的想法进行操作,但是很容易修复),我倾向于认为第一个示例更容
本文向大家介绍shouldComponentUpdate方法是做什么的?相关面试题,主要包含被问及shouldComponentUpdate方法是做什么的?时的应答技巧和注意事项,需要的朋友参考一下 shouldComponentUpdate:确定是否将更新组件。默认情况下,它返回true。如果您确定组件在状态或道具更新后不需要渲染,则可以返回false值。这是提高性能的好地方,因为如果组件收到新
当我从协议缓冲区文件生成go代码时,我注意到每个生成的结构都实现了Message接口,https://github.com/golang/protobuf/blob/master/proto/lib.go#L277 有关生成的代码示例,请参阅https://github.com/google/go-genproto/blob/master/googleapis/rpc/status/status.
我正在研究用户服务,我的理解是它类似于Nest中的用户服务,但不是真的。 在其中,我看到了以下内容: 到底在做什么?为什么不只是: 的目标是什么?
问题内容: 这个问题应该比关于更多。 我有一个子类(在python 2.7中,numpy 1.6.2),并且我发现在对象时未列出的字段名称(因此,ipython的自动完成功能无效)。 为了修复它,我尝试在子类中重写,如下所示: 结果是:。(我发现这里实际上应该在python 3.3中工作…) 作为一种解决方法,我尝试了: 据我所知,这是可行的,但当然并不优雅。 问题: 后一种解决方案对我而言是否正