我是golang的新手,开始根据prometheus client-go编写一些监视器导出程序,发现promethues的源代码具有通道var的定义代码
reloadCh chan chan error
并使用
实例化它reloadCh: make(chan chan error)
通常,可以使用
定义一个通道reloadCh chan error
为什么这里有额外的chan
?
答案 0 :(得分:2)
chan chan error
是错误通道。使用通道的通道的一种常见应用是获得对请求的响应或错误(实际上,您正在查看的普罗米修斯出口商就是这种情况)。使用通道通道的原因是,它允许您选择要将答案传达到的位置(与使用同一通道发送请求和接收响应相反)。
示例:
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上运行它。
Sameer Ajmani的Advanced Go Concurrency Patterns演讲中对此概念做了很好的解释。