Golang 通道传输
编程网今天将给大家带来《Golang 通道传输》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!
问题内容我对 golang 比较陌生,并不完全理解流。我有一个正在进行 rest 调用的函数(断路器函数)。我让它工作,但它只是流回“responsebody”。我实际上想将主体和标头一起流回流的整个请求。
当我尝试在“标头”上使用类似的方法时,我收到一个错误,表明标头不可流式传输。
有没有一个好的/最好的方法来实现这个目标?谢谢。以下是我的功能。
func CallWithRetries(req *http.Request, output chan []byte) error {
r := retrier.New(retrier.ConstantBackoff(RETRIES, 100 * time.Millisecond), nil)
attempt := 0
err := r.Run(func() error {
attempt++
resp, err := Client.Do(req)
if err == nil && resp.StatusCode < 299 {
responseBody, err := ioutil.ReadAll(resp.Body)
if err == nil {
output <- responseBody
return err
}
return err
} else if err == nil {
customLogger.LogDebug("Status code was: " , transactionId)
err = fmt.Errorf("Status was %v", resp.StatusCode)
}
return err
})
return err
}
解决方案
您正在寻找 httputil.DumpResponse 函数。
代码可能会更改为类似的内容
func callwithretries(req *http.request, output chan []byte) error {
r := retrier.new(retrier.constantbackoff(retries, 100*time.millisecond), nil)
attempt := 0
err := r.run(func() error {
attempt++
resp, err := client.do(req)
if err == nil && resp.statuscode < 299 {
dump, err := httputil.dumpresponse(resp, true)
if err == nil {
output <- dump
return err
}
return err
} else if err == nil {
customlogger.logdebug("status code was: ", transactionid)
err = fmt.errorf("status was %v", resp.statuscode)
}
return err
})
return err
}
旁注,
您可能需要考虑关闭响应正文,如文档 https://golang.org/pkg/net/http/#Client.Get 中所述
看起来
err
变量被隐藏,应该修改它以避免任何意外。
此版本的代码尝试尽早返回错误,并关闭响应正文。它没有经过测试,只是临时编写的,请小心使用。
func CallWithRetries(req *http.Request, output chan []byte) error {
r := retrier.New(retrier.ConstantBackoff(RETRIES, 100*time.Millisecond), nil)
attempt := 0
return r.Run(func() error {
attempt++
var resp *http.Response
{
r, err := Client.Do(req)
if err != nil {
return err
}
defer r.Body.Close()
if resp.StatusCode > 299 {
customLogger.LogDebug("Status code was: ", transactionId)
return fmt.Errorf("Status was %v", resp.StatusCode)
}
resp = r
}
var out []byte
{
x, err := httputil.DumpResponse(resp, true)
if err != nil {
return err
}
out = x
}
output <- out
return nil
})
}
本篇关于《Golang 通道传输》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注编程网公众号!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341