美文网首页
【Golang】并发的异常处理

【Golang】并发的异常处理

作者: 冉小妹Ran | 来源:发表于2020-04-08 14:45 被阅读0次

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")
}

相关文章

  • 【Golang】并发的异常处理

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

  • goLang异常处理

    defer defer是go提供的一种资源处理的方式。defer的用法遵循3个原则在defer表达式被运算的同时,...

  • golang异常处理

    go语言没有使用像java python等语言的try catch/except 语句来处理异常,而是使用它特有的...

  • Golang异常处理

    Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。异常和错误是不...

  • golang的异常处理

    go语言是不支持异常的,go语言的设计者认为异常会被不成熟的程序员滥用,导致异常的处理过去复杂;go语言取消异常的...

  • Golang的异常处理

    Golang的异常处理 Golang的优点有很多,以前的文章中也有提到过,但也有很多槽点为Gopher所诟病,尤其...

  • golang笔记——异常处理

    函数返回值处理异常 golang为了避免像写Java一样滥用try catch,可以使用函数多返回值的特性来进行异...

  • golang并发处理示例

  • Golang的异常处理介绍

  • Golang的并发编程

    golang是为并发而生的语言。优雅的并发编程范式,完善的并发支持,出色的并发性能是golang区别于其他语言的一...

网友评论

      本文标题:【Golang】并发的异常处理

      本文链接:https://www.haomeiwen.com/subject/wdjtmhtx.html