从异步函数/go例程返回错误/成功的惯用方法

从异步函数/go例程返回错误/成功的惯用方法,go,channel,goroutine,Go,Channel,Goroutine,我正在研究围棋程序和通道,对返回错误有一个疑问: 如果我有结果或错误,我会执行以下操作: func Do() (int,error) 变成 func DoAsync() (<-chan int, <-chan error) 我通常会返回error或nil表示成功 func DoAsync() <-chan error func DoAsync()这个问题没有单一的答案。这是你的目标问题。您想如何处理这些错误?记录它们?中止操作并返回它们?还有别的吗?还要注意,在编写库时,

我正在研究围棋程序和通道,对返回错误有一个疑问:

如果我有结果或错误,我会执行以下操作:

func Do() (int,error)
变成

func DoAsync() (<-chan int, <-chan error)
我通常会返回error或nil表示成功

func DoAsync() <-chan error

func DoAsync()这个问题没有单一的答案。这是你的目标问题。您想如何处理这些错误?记录它们?中止操作并返回它们?还有别的吗?还要注意,在编写库时,最好编写同步函数,而不是异步函数。在Go中,将函数作为goroutine启动是很简单的,因此将选项留给调用方希望如何执行该函数。这样,您也不必费心如何处理结果,这取决于您的客户机。如果您想报告错误或成功,则可能不使用异步。等待作业完成,并报告其最终状态。没有“惯用”方法。惯用的方法是避免像icza解释的那样去做。在我的$dayjob中,一种惯用的方法是声明一个helper
struct
类型,其中有两个字段,一个用于“正常结果”,另一个包含
error
,并使函数返回该类型的通道。客户机应该从该通道接收,然后检查
error
字段是否为
nil
,并且仅在与具有多个返回值(其中一个是错误)的Go函数通常使用的逻辑不同的情况下使用另一个字段。但在这组评论中,我和其他人一样:首先检查您的客户机是否真的会从异步API中受益。
func DoAsync() <-chan error