gpt4 book ai didi

go - `sync.WaitGroup` 的方法集是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:52:24 26 4
gpt4 key购买 nike

下面有这个简单的程序

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 作为值,而不是指针。但是 page for the sync package指定 AddDoneWait 函数采用 *sync.WaitGroup

为什么/这是如何工作的?

最佳答案

method setsync.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()等的简写

这是在Spec: Calls:

If x is addressable and &x's method set contains m, x.m() is shorthand for (&x).m().

因此,当您有一个可寻址的值(一个变量是可寻址的)时,您可以在非指针值上调用任何具有指针接收者的方法,编译器将自动获取地址并将其用作接收者值。

查看相关问题:

Calling a method with a pointer receiver by an object instead of a pointer to it?

关于go - `sync.WaitGroup` 的方法集是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com