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

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

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

場(chǎng)景

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

使用方法

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

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

正常我們獲取返回值應(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吧,按官方文檔來(lái)說(shuō),是為了將寫好的數(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ā)送的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

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

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

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

    Go語(yǔ)言清除文件中空行的方法

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

    Golang中指針的使用詳解

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

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

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

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

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

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

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

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

    Go 語(yǔ)言使用 error 類型來(lái)返回函數(shù)執(zhí)行過(guò)程中遇到的錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于如何基于golang實(shí)現(xiàn)error工具包的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(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語(yǔ)言實(shí)現(xiàn)socket實(shí)例

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

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

    詳解Golang中的交叉編譯

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

最新評(píng)論

岢岚县| 保靖县| 罗源县| 紫阳县| 龙山县| 高青县| 湘潭市| 土默特右旗| 江北区| 石狮市| 唐河县| 山丹县| 赤水市| 镇沅| 县级市| 怀柔区| 大悟县| 银川市| 巴塘县| 德保县| 柳林县| 宽城| 浦东新区| 吉林市| 项城市| 伊春市| 南漳县| 来安县| 紫金县| 邵东县| 武宣县| 云霄县| 洛浦县| 大英县| 贵州省| 汤阴县| 鹤岗市| 集贤县| 东城区| 临湘市| 石家庄市|