我有一个可能会或可能不会被称为异步转发例程的函数。
func APICall(request *HTTPRequest) *HTTPResponse
*HTTPRequest
是指向结构的指针,该结构包含构建请求所需的各种数据:
type HTTPRequest struct {
// Represents a request to the twitter API
method string
baseurl string
urlParams map[string]string
bodyParams map[string]string
authParams map[string]string
responseChan chan *HTTPResponse
}
如果被称为goroutine,即传入一个频道;我们构建请求并将响应写入所提供通道的* HTTPResponse对象(也是结构)。在没有通道的情况下接受对函数的调用的最优雅/惯用方法是什么(即非同步)
目前,我们在APICall的主体内做了类似的事情来处理这两种函数调用:
if request.responseChan != nil { // If a response channel has been specified, write to that channel
request.responseChan <- &twitterHTTPResponse{body, nil}
return nil // Not returning a struct
} else {
return &twitterHTTPResponse{body, nil} // Return a pointer to a new struct representing the response
}
我们是否沿着正确的路线前进?
答案 0 :(得分:5)
惯用法是提供同步API:
type HTTPRequest struct {
// Represents a request to the twitter API
method string
baseurl string
urlParams map[string]string
bodyParams map[string]string
authParams map[string]string
}
func APICall(request *HTTPRequest) *HTTPResponse {
...
return &twitterHTTPResponse{body, nil}
}
如果需要同时运行调用,调用者可以轻松创建goroutine。例如:
r := make(chan *HTTPResponse)
go func() {
r <- APICall(req)
}()
... do some other work
resp := <- r
同步API是惯用的,原因有两个: