当前位置: 首页 > 面试题库 >

`sync.WaitGroup`的方法是什么?

东方河
2023-03-14
问题内容

我下面有这个简单的程序

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包的页面指定AddDoneWait函数采用*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方法集包含mx.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中工作…) 作为一种解决方法,我尝试了: 据我所知,这是可行的,但当然并不优雅。 问题: 后一种解决方案对我而言是否正