首页 > 后端开发 > Golang > 为什么Go的sync.WaitGroup可以在没有指针的情况下工作?

为什么Go的sync.WaitGroup可以在没有指针的情况下工作?

Barbara Streisand
发布: 2024-12-06 22:27:15
原创
807 人浏览过

Why Can Go's sync.WaitGroup Work Without a Pointer?

为什么sync.WaitGroup可以在没有指针接收器的情况下工作?

在Go中,sync.WaitGroup类型用于同步goroutine。 sync.WaitGroup 的方法(例如 Add、Done 和 Wait)是使用指针接收器定义的。但是,声明不带指针 (*) 的sync.WaitGroup 值是很常见的。

考虑以下代码片段:

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()
}
登录后复制

在此代码中,我们将 wg 声明为sync.WaitGroup不带指针的值 (*)。这是可能的,因为 Go 允许在非指针值上使用指针接收器。

在底层,Go 将非指针值(例如在 wg.Add(1) 中)转换为指针值(例如 &wg.Add(1))。这允许在非指针值上调用sync.WaitGroup的方法。

对sync.WaitGroup方法集的反思

sync的方法集。 WaitGroup 是空的,因为它的所有方法都有指针接收器。下面的反射代码证实了这一点:

wg := sync.WaitGroup{}
fmt.Println(reflect.TypeOf(wg).NumMethod()) // Outputs 0
登录后复制

这意味着sync.WaitGroup没有任何可以直接在非指针值上调用的方法。

结论

在 Go 中声明不带指针 (*) 的sync.WaitGroup 值是很常见的。这是可能的,因为 Go 允许在非指针值上使用指针接收器。 sync.WaitGroup 的方法集是空的,因为它的所有方法都有指针接收器,这些接收器是由编译器自动从非指针值转换而来的。

以上是为什么Go的sync.WaitGroup可以在没有指针的情况下工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板