gpt4 book ai didi

go - 创建类似 "reloadCh chan chan error"的 channel 是什么意思

转载 作者:IT王子 更新时间:2023-10-29 02:01:44 25 4
gpt4 key购买 nike

刚接触golang,开始写一些基于prometheus client-go的monitor exporter,发现promethues的源码中有这样定义channel var的代码

reloadCh     chan chan error

并使用

实例化它
reloadCh:    make(chan chan error)

像往常一样,一个 channel 可以定义为

reloadCh     chan error

为什么额外的 chan 在这里?

最佳答案

chan chan error 是错误 channel 的 channel 。使用 channel channel 的常见应用之一是获得对请求的响应或错误(实际上,您正在查看的普罗米修斯导出商就是这种情况)。使用 channel of channels 的原因是它允许您选择要将答案传达到的位置(与使用相同的 channel 发送请求和接收响应相反)。

一个例子:

package main

import (
"errors"
"fmt"
"math/rand"
"time"
)

func main() {

requestChan := make(chan chan error)

// Starting the service goroutine
go goroutine(requestChan)

// Send 5 requests and collect errors
for i := 0; i < 5; i++ {
fmt.Printf("Request %v\n", i+1)

// Make channel that will be used to communicate error back to main
errorChan := make(chan error)

requestChan <- errorChan

err := <-errorChan
fmt.Printf("Erro received: %v\n\n", err)

time.Sleep(1 * time.Second)

}
}

func goroutine(requestChan <-chan chan error) {

for {
select {
case errChan := <-requestChan:
fmt.Println("Got request from requestChan")
errChan <- someOperation()
}
}
}

// someOperation that will sometimes return nil error and sometimes it will return error
func someOperation() error {

if rand.Intn(10) > 5 {
return nil
}

return errors.New("error for someOperation")
}

go playground 上运行它.

Advanced Go Concurrency Patterns 中给出了对这个概念的很好解释。 Sameer Ajmani 的演讲。

关于go - 创建类似 "reloadCh chan chan error"的 channel 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51296922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com