【Golang】并发的异常处理

go语言的并发实现起来很简单,只需要一个go关键字即可使函数并发,但是捕捉并发方法中的错误就没有那么方便了。
本文总结在go语言中,并发时处理异常的一个方法。

channal.go
这个go文件中,有两个函数sum和sub,如果第一个int比第二个int小的话就抛出错误,否则正常运行。

package main

import (
    "errors"
    "fmt"
    "sync"
)

type calculate func(int, int, *sync.WaitGroup) (int, error)

func main() {
    wg := &sync.WaitGroup{}
    cals := []calculate{sum, sub}
    for _, v := range cals {
        wg.Add(1)
        go v(1, 2, wg)
    }
    wg.Wait()
}

func sum(a int, b int, wg *sync.WaitGroup) (int, error) {
    defer wg.Done()
    fmt.Println(a + b)
    if a > b {
        return a + b, nil
    }
    return 0, errors.New("a is smaller than b")

}

func sub(a int, b int, wg *sync.WaitGroup) (int, error) {
    defer wg.Done()
    fmt.Println(a - b)
    if a > b {
        return a - b, nil
    }
    return 0, errors.New("a is smaller than b")
}

目前看起来没有什么问题。但是该怎么处理sum和sub抛出的错误呢?

解决方法
创建一个struct用来存放协程里面抛出的错误。

type results struct {
    result int
    err    error
}

完整代码

package main

import (
    "errors"
    "fmt"
    "sync"
)

type calculate func(int, int) (int, error)

type results struct {
    result int
    err    error
}

func main() {
    wg := &sync.WaitGroup{}
    cals := []calculate{sum, sub}
    resultchan := make(chan results, len(cals))
    for _, v := range cals {
        wg.Add(1)
        go func(cal calculate) {
            result, err := cal(3, 2)
            resultchan <- results{result, err}
            wg.Done()
        }(v)
    }
    wg.Wait()
    close(resultchan)

    for v := range resultchan {
        if v.err != nil {
            fmt.Println(v.err)
            continue
        }
        fmt.Println(v.result)
    }
}

func sum(a int, b int) (int, error) {
    if a > b {
        return a + b, nil
    }
    return 0, errors.New("a is smaller than b")
}

func sub(a int, b int) (int, error) {
    if a > b {
        return a - b, nil
    }
    return 0, errors.New("a is smaller than b")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容