- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在golang中,当我们需要等待某事完成时,我们会使用一个channel。
例子:
done := make(chan struct{})
go func() {
// ...
close(done)
}()
<-done
但是,换句话说,chan interface{}
也适用于这种情况。
那么,chan struct{}
和 chan interface{}
有什么区别?
例子2:
done := make(chan struct{})
go func() {
// ...
done <- struct{}{}
}()
<- done
在其他情况下,如果不关闭 goroutine 中的 channel 而不是向其发送对象。
会在 goroutine 中创建一个对象,但如果使用 chan 接口(interface){}
,可以将 nil
对象发送到 channel 。
使用 chan struct{}
更好吗?
最佳答案
在您的“完成” channel 示例中,从功能上讲, channel 实际上可以是任何类型,因为实际上没有发送数据,并且 channel 仅用作信号机制。但为了内存利用率,struct{}
是 Go 中可用的最小数据类型,因为它几乎不包含任何内容,因此不需要分配,这就是为什么它通常用于此类场景。
关于go - 为什么在等待完成时使用 `chan struct{}` 而不是 `chan interface{}`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52035390/
Golang 新手在这里。 两者在功能上有区别吗 func randomNumberGenerator() <-chan int { 和 func randomNumberGenerator() ch
我想从一个函数返回一个 []<-chan int 给定的 []chan int,但即使转换也不起作用。 你 可以将 分配给 chan T 或 chan<- T (隐式类型转换)。我不知道为什么你 不能
在golang中,当我们需要等待某事完成时,我们会使用一个channel。 例子: done := make(chan struct{}) go func() { // ... clo
我正在实现一个简单的工作池算法,其中 1 个 Sender(调度程序)将作业发送到 M(Worker)go 例程。为此,它使用一个 channel 的 channel 来为第一个空闲的工作人员分配一个
这是我收到的错误消息: cannot use c.ReceiverChans (type []chan *Message) as type []chan interface {} in functio
package main import "fmt" func x(foo []string, cz chan string) { for i := range foo { cz
刚接触golang,开始写一些基于prometheus client-go的monitor exporter,发现promethues的源码中有这样定义channel var的代码 reloadCh
今天我在学习 channels 和 goroutine of go。我遇到了一些让我困惑的现象。 我的 go 文件如下所示: package main import ( "fmt" ) fun
有如下代码: func consumeQueue(ch *amqp.Channel, q_Name string) (chan amqp.Delivery) { msgs, err := ch
我的问题来自尝试读取 channel ,如果可以的话,或者写它,如果可以的话,使用 select声明。 我知道像 make(chan bool, 1) 这样指定的 channel 被缓冲了,我的部分问
遇到golang channel 的一个问题:发现go 协程读取channel 数据 并没有按照预期进行协作执行。 经过查资料: 使用channel 操作不当导致,channel分 有
我认为它们是一样的,但是The go memory model中有一个这样的词:, 如果 channel 被缓冲(例如,c = make(chan int, 1))那么程序将不能保证打印“hello,
我知道如果有多个“通信”可以在 select 中进行。声明一个是随机选择的。我正在尝试找到一种替代方法,它可以更喜欢一种“交流”而不是另一种。 背景是我正在使用上下文杀死的 channel 上的 go
我想维护一个 channel 集合,并且能够添加和删除 channel 。是否定义了相等性,以便我可以正确地 conj 和 disj ? 换句话说,这总是有效吗? => (def chan-colle
一段时间以来,我一直在尝试理解 Go 中的 channel 。但有一件事让我感到奇怪。当你打电话时究竟发生了什么, for { select { case <-chan: } } 它是
是否可以让函数 funcWithNonChanResult 具有以下接口(interface): func funcWithNonChanResult() int { 如果我想让它在接口(interf
我有一个功能: func f(input interface{}) interface{} { t := reflect.ChanOf(reflect.BothDir, ) c :=
我正在编写一个 python 脚本,我正在尝试获取相机 .chan 光圈值 - 水平和垂直,因为我将使用这些值并将其传输到 Maya 相机中。 但是,即使我打开 .chan,我也只看到几行/列/行或属
我正在尝试调用 name.com API(并且成功了,除了一次调用......当我尝试调用他们的 Search() 方法时,我收到错误。 这是我的代码: func TestExecute() stri
我想了解为什么这种情况会陷入僵局,而另一种情况却不会。 如果我在 goroutine 中关闭 channel ,它工作正常,但如果我在 WaitGroup.Wait() 之后关闭它会导致死锁。 pac
我是一名优秀的程序员,十分优秀!