golang 流式讀取和發(fā)送使用場景示例
更新時間:2023年12月18日 08:48:05 作者:丿幻灬影丨
這篇文章主要為大家介紹了golang 流式讀取和發(fā)送使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
場景
- 部分大模型(如gpt)的流式讀取,可以增加用戶體驗。
- gin框架的流式問答,與前端交互。
使用方法
- 我在使用框架req 的時候,發(fā)現無法從resp.Body流式讀取數據,只能完整讀出來
原因是框架自動幫我們讀取了resp,導致我們無法讀取流式的消息。
正常我們獲取返回值應該是這樣的:
resp := c.c.Post(url).SetQueryParam("key", c.key).SetBody(msg).Do(ctx)
data := resp.String()想要讀取流式可以這么做:
resp := c.c.DisableAutoReadResponse().Post(url).SetQueryParam("key", c.key).SetBody(msg).Do(ctx)
defer resp.Body.Close()
scanner := bufio.NewScanner(resp.Body)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, "text") {
fmt.Println(line)
}
}- 現在我們知道了如何從外部讀取流式數據,那么我們如何利用web框架發(fā)送流式數據呢?
以gin框架為例
可以使用func (c *Context) Stream(step func(w io.Writer) bool) bool函數
==具體使用方法如下==(這里我用了自己的代碼做了演示):
如果前端有需求,需要加上Header
c.Header("Content-Type", "application/octet-stream")用bufio緩沖區(qū)向前端寫數據
stop := c.Stream(func(w io.Writer) bool {
bw := bufio.NewWriter(w)
if len(r.Choices) != 0 {
gptResult.Detail = &r
gptResult.Id = r.ID
gptResult.Role = openai.ChatMessageRoleAssistant
gptResult.Text += r.Choices[0].Delta.Content // 流傳輸
marshal, _ := json.Marshal(gptResult)
if _, err := fmt.Fprintf(bw, "%s\n", marshal); err != nil {
fmt.Println(err)
return true
}
bw.Flush()
}
return false
}) //stop
if stop {
fmt.Println("stop")
break
}順便講一下flush吧,按官方文檔來說,是為了將寫好的數據發(fā)送給客戶端。
// The Flusher interface is implemented by ResponseWriters that allow
// an HTTP handler to flush buffered data to the client.
type Flusher interface {
// Flush sends any buffered data to the client.
Flush()
}以上就是golang流式讀取和發(fā)送的詳細內容,更多關于golang流式讀取和發(fā)送的資料請關注腳本之家其它相關文章!

