欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang 流式讀取和發(fā)送使用場景示例

 更新時間:2023年12月18日 08:48:05   作者:丿幻灬影丨  
這篇文章主要為大家介紹了golang 流式讀取和發(fā)送使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

場景

  • 部分大模型(如gpt)的流式讀取,可以增加用戶體驗。
  • gin框架的流式問答,與前端交互。

使用方法

  • 我在使用框架req 的時候,發(fā)現(xiàn)無法從resp.Body流式讀取數(shù)據(jù),只能完整讀出來

原因是框架自動幫我們讀取了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)
    }
}
  • 現(xiàn)在我們知道了如何從外部讀取流式數(shù)據(jù),那么我們?nèi)绾卫脀eb框架發(fā)送流式數(shù)據(jù)呢?

以gin框架為例

可以使用func (c *Context) Stream(step func(w io.Writer) bool) bool函數(shù)

==具體使用方法如下==(這里我用了自己的代碼做了演示):

如果前端有需求,需要加上Header

c.Header("Content-Type", "application/octet-stream")

用bufio緩沖區(qū)向前端寫數(shù)據(jù)

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吧,按官方文檔來說,是為了將寫好的數(shù)據(jù)發(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ā)送的詳細內(nèi)容,更多關于golang流式讀取和發(fā)送的資料請關注腳本之家其它相關文章!

相關文章

  • 深入理解Golang?Channel?的底層結構

    深入理解Golang?Channel?的底層結構

    這篇文章主要介紹了深入理解Golang?Channel?的底層結構,Go?語言的?channel?底層是什么數(shù)據(jù)結構?下面我們就一起來深入解析一下?channel,需要的朋友可以參考下
    2022-01-01
  • Golang Gin框架中間件的用法詳解

    Golang Gin框架中間件的用法詳解

    中間件是Gin框架中的一個核心概念,它允許開發(fā)者在處理HTTP請求的過程中插入自定義的鉤子函數(shù),從而實現(xiàn)諸如日志記錄、身份驗證、權限控制等公共邏輯,本文將結合實際案例,詳細講解Gin框架中間件的用法
    2024-10-10
  • Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項目實踐

    Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項目實踐

    本文主要介紹了Golang并發(fā)讀取文件數(shù)據(jù)并寫入數(shù)據(jù)庫的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • golang使用go test輸出單元測試覆蓋率的方式

    golang使用go test輸出單元測試覆蓋率的方式

    單元測試覆蓋率是衡量代碼質(zhì)量的一個重要指標,重要的代碼文件覆蓋率應該至少達到80%以上,Java 可以通過JaCoCo 統(tǒng)計覆蓋率,那么go 項目如何進行代碼覆蓋率測試呢,本文將給大家詳細的介紹一下golang使用go test輸出單元測試覆蓋率的方式,需要的朋友可以參考下
    2024-02-02
  • go 生成器模式的具體使用

    go 生成器模式的具體使用

    生成器是一種創(chuàng)建型設計模式,使你能夠分步驟創(chuàng)建復雜對象,本文主要介紹了go生成器模式的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn)

    GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn)

    本文主要介紹了GO利用channel協(xié)調(diào)協(xié)程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • go語言按顯示長度截取字符串的方法

    go語言按顯示長度截取字符串的方法

    這篇文章主要介紹了go語言按顯示長度截取字符串的方法,涉及Go語言操作字符串的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 利用go-zero在Go中快速實現(xiàn)JWT認證的步驟詳解

    利用go-zero在Go中快速實現(xiàn)JWT認證的步驟詳解

    這篇文章主要介紹了如何利用go-zero在Go中快速實現(xiàn)JWT認證,本文分步驟通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-10-10
  • Go語言實現(xiàn)的web爬蟲實例

    Go語言實現(xiàn)的web爬蟲實例

    這篇文章主要介紹了Go語言實現(xiàn)的web爬蟲,實例分析了web爬蟲的原理與Go語言的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go中strings包的基本使用示例代碼

    Go中strings包的基本使用示例代碼

    本文詳細介紹了Go語言中strings包的基本使用方法,包括字符串的前綴、后綴判斷,字符串包含、索引查找、字符串替換、計數(shù)、重復、大小寫轉(zhuǎn)換、修剪、分割、拼接以及數(shù)據(jù)類型轉(zhuǎn)換等功能,示例代碼豐富,適合初學者和需要使用字符串處理功能的開發(fā)者參考學習
    2024-10-10

最新評論