之前在做其他语言是,对于异步调用,总有返回值和错误返回,并且能接收,对其进行处理。
在go语言中,对于协程goroutine的代码,因为没有返回值接收,导致新手在学习时候会有困惑:
goroutine的返回值(包括错误)怎么捕获呢?
下面我们写一个列子来说明下。
package main
import (
"fmt"
"log"
"time"
)
type Resp struct {
data int
error error
}
func main() {
handleMsg()
}
func handleMsg() {
resp := make(chan Resp)
stop := make(chan struct{})
go func() {
t := time.Tick(time.Second)
index := 0
for {
select {
case <-t:
resp <- Resp{
data: index,
}
index++
case <-stop:
resp <- Resp{
error: fmt.Errorf("time tick stop error"),
}
}
}
}()
for {
select {
case val := <-resp:
if val.error != nil {
log.Fatal(val.error)
}
if val.data == 5 {
stop <- struct{}{}
}
fmt.Println("index", val.data)
}
}
}
这里Resp封装了接收值和错误类型,
type Resp struct {
data int
error error
}
利用select的接手值,来判断当前goroutine的结果是否正确。
有疑问加站长微信联系(非本文作者)