Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 通道作为参数,为什么不使用星号?_Go - Fatal编程技术网

Go 通道作为参数,为什么不使用星号?

Go 通道作为参数,为什么不使用星号?,go,Go,当我在函数末尾传递一个通道作为参数来关闭它时,我不需要在它前面加*来引用主函数作用域中的通道。但是当我要将WaitGroup设置为done(wg.done())时,我必须这样做,这是为什么呢?在Go中,chan是一个语言原语,sync.WaitGroup是一个结构。由于Go通过值传递参数,WaitGroup将作为副本传递,而chan将作为接口传递,该接口被实现为原语类型,元数据包括指向实现细节的指针。在Go中,chan是一种语言原语,而sync.WaitGroup是一个结构。由于Go通过值传递参

当我在函数末尾传递一个通道作为参数来关闭它时,我不需要在它前面加*来引用主函数作用域中的通道。但是当我要将WaitGroup设置为done(wg.done())时,我必须这样做,这是为什么呢?

在Go中,
chan
是一个语言原语,
sync.WaitGroup
是一个结构。由于Go通过值传递参数,
WaitGroup
将作为副本传递,而
chan
将作为
接口
传递,该接口被实现为原语类型,元数据包括指向实现细节的指针。

在Go中,
chan
是一种语言原语,而
sync.WaitGroup
是一个结构。由于Go通过值传递参数,
WaitGroup
将作为副本传递,而
chan
将作为
接口
传递,该接口被实现为原始类型,元数据包括指向实现细节的指针。

这是因为在内部,
chan
在某种程度上是由指针组成的结构。您不需要发送指向它的指针。相反,
sync.WaitGroup
是一个经典的结构

type WaitGroup struct {
    state1 [12]byte
    sema   uint32
}

对于其所有方法都是用指针接收器声明的,因此您需要向其传递指针以在不同的范围内使用它。

这是因为在内部,
chan
多少是由指针组成的结构。您不需要发送指向它的指针。相反,
sync.WaitGroup
是一个经典的结构

type WaitGroup struct {
    state1 [12]byte
    sema   uint32
}
对于其所有方法都是用指针接收器声明的,因此您需要向其传递一个指针,以便在不同的范围内使用它