为什么可以在值而不是指针上调用sync.WaitGroup方法?
尽管sync.WaitGroup文档表明其方法需要一个*sync.WaitGroup 接收器,可以对sync.WaitGroup 类型的值调用这些方法。这是因为所有sync.WaitGroup方法都有指针接收器,这意味着编译器在调用该方法时会自动将值转换为指针。
sync.WaitGroup的空方法集
sync.WaitGroup 的实际方法集是空的。为了确认这一点,你可以使用反射:
wg := sync.WaitGroup{} fmt.Println(reflect.TypeOf(wg).NumMethod()) // Output: 0
因此,看起来在sync.WaitGroup值上定义的方法实际上是*sync.WaitGroup方法集的一部分。
对值调用指针方法的简写符号
当您调用指针时方法对一个值,编译器将其转换为对该值的指针的调用。例如:
var wg sync.WaitGroup wg.Add(1)
等价于:
(&wg).Add(1)
Go 规范规定,如果一个变量是可寻址的并且其方法集包含一个方法,则直接在该变量上调用该方法变量是在指向该变量的指针上调用它的简写。
相关问题
有关此主题的更多信息,请参阅相关问题:
以上是为什么我可以对值调用sync.WaitGroup 方法,而不仅仅是指针?的详细内容。更多信息请关注PHP中文网其他相关文章!