sync.WaitGroup 的方法集
sync.WaitGroup 是一个同步原语,使您能够等待 goroutine 集合完成。虽然其文档表明 Add、Done 和 Wait 方法需要指针接收器,但您也可以在非指针值上使用它们。这怎么可能?
秘密在于sync.WaitGroup的空方法集。这意味着sync.WaitGroup的所有方法都是指针接收器。当您创建sync.WaitGroup类型的值时,例如:
var wg sync.WaitGroup
您实际上正在创建一个指向sync.WaitGroup结构体的指针。当您调用 wg 变量上的方法时,该指针会自动取消引用。例如,以下代码可以成功编译:
wg.Add(1) wg.Done() wg.Wait()
Go 编译器在调用方法之前将 wg 隐式转换为指向sync.WaitGroup 的指针。此行为在 Go 语言规范中定义:
如果 x 是可寻址的并且 &x 的方法集包含 m,则 x.m() 是 (&x).m() 的简写。
因此,您如果这些值是可寻址的,则可以调用在非指针值上具有指针接收器的方法。非指针值在 Go 中始终是可寻址的。
以上是为什么可以对非指针值调用sync.WaitGroup方法?的详细内容。更多信息请关注PHP中文网其他相关文章!