首页 >后端开发 >Golang >为什么我可以对值调用sync.WaitGroup 方法,而不仅仅是指针?

为什么我可以对值调用sync.WaitGroup 方法,而不仅仅是指针?

Barbara Streisand
Barbara Streisand原创
2024-12-16 07:44:09527浏览

Why Can I Call sync.WaitGroup Methods on Values, Not Just Pointers?

为什么可以在值而不是指针上调用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 规范规定,如果一个变量是可寻址的并且其方法集包含一个方法,则直接在该变量上调用该方法变量是在指向该变量的指针上调用它的简写。

相关问题

有关此主题的更多信息,请参阅相关问题:

  • [通过对象而不是指向它的指针调用带有指针接收器的方法? ](https://stackoverflow.com/questions/4239271)

以上是为什么我可以对值调用sync.WaitGroup 方法,而不仅仅是指针?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn