最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

場景

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

使用方法

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

原因是框架自動幫我們讀取了resp,導(dǎo)致我們無法讀取流式的消息。

正常我們獲取返回值應(yīng)該是這樣的:

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ā)送的詳細(xì)內(nèi)容,更多關(guān)于golang流式讀取和發(fā)送的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言用map實(shí)現(xiàn)堆棧功能的方法

    Go語言用map實(shí)現(xiàn)堆棧功能的方法

    這篇文章主要介紹了Go語言用map實(shí)現(xiàn)堆棧功能的方法,實(shí)例分析了Go語言使用map操作堆棧的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Go語言清除文件中空行的方法

    Go語言清除文件中空行的方法

    這篇文章主要介紹了Go語言清除文件中空行的方法,實(shí)例分析了Go語言針對文件的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Golang中指針的使用詳解

    Golang中指針的使用詳解

    Golang是一門支持指針的編程語言,指針是一種特殊的變量,存儲了其他變量的地址。通過指針,可以在程序中直接訪問和修改變量的值,避免了不必要的內(nèi)存拷貝和傳遞。Golang中的指針具有高效、安全的特點(diǎn),在并發(fā)編程和底層系統(tǒng)開發(fā)中得到廣泛應(yīng)用
    2023-04-04
  • 使用Go語言實(shí)現(xiàn)簡單聊天系統(tǒng)

    使用Go語言實(shí)現(xiàn)簡單聊天系統(tǒng)

    本文介紹了如何使用Go語言和WebSocket技術(shù)構(gòu)建一個(gè)簡單的多人聊天室系統(tǒng),包括客戶端連接管理、消息廣播和并發(fā)處理,最后,通過編寫main.go、hub.go和client.go等核心代碼模塊,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10
  • go語言字符串的拼接和切片方法總結(jié)

    go語言字符串的拼接和切片方法總結(jié)

    在go語言中,因?yàn)樽址荒鼙辉L問,不能被修改,所以進(jìn)行字符串拼接的時(shí)候,golang都需要進(jìn)行內(nèi)存拷貝,造成一定的性能消耗,這篇文章主要給大家介紹了關(guān)于go語言字符串的拼接和切片的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Go并發(fā)編程之死鎖與活鎖的案例分析

    Go并發(fā)編程之死鎖與活鎖的案例分析

    死鎖就是在并發(fā)程序中,兩個(gè)或多個(gè)線程彼此等待對方完成操作,從而導(dǎo)致它們都被阻塞,并無限期地等待對方完成;活鎖就是程序一直在運(yùn)行,但是無法取得進(jìn)展。本文將從一些案例出發(fā),分析一下它們,希望對大家有所幫助
    2023-04-04
  • 基于golang如何實(shí)現(xiàn)error工具包詳解

    基于golang如何實(shí)現(xiàn)error工具包詳解

    Go 語言使用 error 類型來返回函數(shù)執(zhí)行過程中遇到的錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于如何基于golang實(shí)現(xiàn)error工具包的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • golang int64轉(zhuǎn)int的方法

    golang int64轉(zhuǎn)int的方法

    這篇文章主要介紹了golang int64轉(zhuǎn)int,本文給大家提供兩種方法 ,將 golang int64 轉(zhuǎn)換為golang int,結(jié)合實(shí)例代碼給大家分享轉(zhuǎn)換方法,需要的朋友可以參考下
    2023-01-01
  • Go語言實(shí)現(xiàn)socket實(shí)例

    Go語言實(shí)現(xiàn)socket實(shí)例

    這篇文章主要介紹了Go語言實(shí)現(xiàn)socket的方法,實(shí)例分析了socket客戶端與服務(wù)器端的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • 詳解Golang中的交叉編譯

    詳解Golang中的交叉編譯

    在 Golang 中,交叉編譯指的是在同一臺機(jī)器上生成針對不同操作系統(tǒng)或硬件架構(gòu)的二進(jìn)制文件,這在開發(fā)跨平臺應(yīng)用或構(gòu)建特定平臺的發(fā)布版本時(shí)非常有用,本文就詳細(xì)的給大家介紹一下Golang中的交叉編譯,需要的朋友可以參考下
    2023-08-08

最新評論

普定县| 呼和浩特市| 纳雍县| 肥城市| 金坛市| 聂拉木县| 岳阳市| 民和| 凯里市| 淳安县| 简阳市| 比如县| 承德县| 哈尔滨市| 普安县| 元朗区| 东丽区| 凌海市| 虎林市| 十堰市| 遂平县| 庆云县| 登封市| 保德县| 霍林郭勒市| 青州市| 南漳县| 光泽县| 中卫市| 伊宁县| 兴宁市| 通化市| 绥江县| 兴安县| 鄂托克前旗| 施甸县| 阿鲁科尔沁旗| 南宫市| 临颍县| 静宁县| 娄底市|