我是否应该关心在我的go库中提供异步调用?

我是否应该关心在我的go库中提供异步调用?,go,Go,我正在为http上的jsonrpc开发一个简单的go库 有以下方法: rpcClient.Call("myMethod", myParam1, myParam2) 此方法在内部执行http.Get()并返回结果或错误(元组) 这当然是调用方的synchron,并在Get()调用返回时返回 这是在围棋中提供图书馆的方式吗?如果我的库的用户愿意的话,我是否应该让它成为异步的呢 或者我应该提供第二个函数,称为: rpcClient.CallAsync() 在这里返回一个频道?因为通道不能提供元组,

我正在为http上的jsonrpc开发一个简单的go库

有以下方法:

rpcClient.Call("myMethod", myParam1, myParam2)
此方法在内部执行http.Get()并返回结果或错误(元组)

这当然是调用方的synchron,并在Get()调用返回时返回

这是在围棋中提供图书馆的方式吗?如果我的库的用户愿意的话,我是否应该让它成为异步的呢

或者我应该提供第二个函数,称为:

rpcClient.CallAsync()
在这里返回一个频道?因为通道不能提供元组,所以我必须将(响应、错误)元组打包到一个结构中,并返回该结构

这有意义吗

否则,用户将不得不用一个丑陋的方法包装每个调用,如:

result := make(chan AsyncResponse)
go func() {
    res, err := rpcClient.Call("myMethod", myParam1, myParam2)
    result <- AsyncResponse{res, err}
}()
result:=make(响应)
go func(){
res,err:=rpcClient.Call(“myMethod”,myParam1,myParam2)

结果go的执行模型的全部要点是对开发人员隐藏异步操作,其行为类似于带有阻塞操作的线程模型。在幕后有绿色线程、异步IO和非常复杂的调度程序

因此,不应该为库提供异步API。从代码的角度来看,go中的联网是以伪阻塞的方式完成的,您可以根据需要打开任意多个Goroutine,因为它们非常便宜

这样,你的最后一个例子就是方法,我不认为它是丑陋的。因为它允许开发者选择并发模型。在HTTP服务器的上下文中,每个命令都在单独的GOODUTE中处理,我只调用<代码> RPCclipse。调用(“MyMead”,MyPARAM1,MyPARAM2)< /COD> < /P> 或者,如果我想要扇出,我将创建扇出逻辑

您还可以创建一个方便的函数,用于在通道上执行调用和返回:

func CallAsync(method, p1, p2) chan AsyncResponse {
    result := make(chan AsyncResponse)
    go func() {
        res, err := rpcClient.Call(method, p1, p2)
        result <- AsyncResponse{res, err}
    }()
    return result
}
func CallAsync(方法,p1,p2)chan async响应{
结果:=生成(响应)
go func(){
res,err:=rpcClient.Call(方法,p1,p2)
后果