golang 流式读取和发送使用场景示例

 更新时间:2023年12月18日 08:48:05   作者:丿幻灬影丨  
这篇文章主要为大家介绍了golang 流式读取和发送使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

场景

  • 部分大模型(如gpt)的流式读取,可以增加用户体验。
  • gin框架的流式问答,与前端交互。

使用方法

  • 我在使用框架req 的时候,发现无法从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框架发送流式数据呢?

以gin框架为例

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

==具体使用方法如下==(这里我用了自己的代码做了演示):

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

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

用bufio缓冲区向前端写数据

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吧,按官方文档来说,是为了将写好的数据发送给客户端。

// 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流式读取和发送的详细内容,更多关于golang流式读取和发送的资料请关注脚本之家其它相关文章!

相关文章

  • 深入理解Golang Channel 的底层结构

    深入理解Golang Channel 的底层结构

    这篇文章主要介绍了深入理解Golang Channel 的底层结构,Go 语言的 channel 底层是什么数据结构?下面我们就一起来深入解析一下 channel,需要的朋友可以参考下
    2022-01-01
  • Golang Gin框架中间件的用法详解

    Golang Gin框架中间件的用法详解

    中间件是Gin框架中的一个核心概念,它允许开发者在处理HTTP请求的过程中插入自定义的钩子函数,从而实现诸如日志记录、身份验证、权限控制等公共逻辑,本文将结合实际案例,详细讲解Gin框架中间件的用法
    2024-10-10
  • Golang并发读取文件数据并写入数据库的项目实践

    Golang并发读取文件数据并写入数据库的项目实践

    本文主要介绍了Golang并发读取文件数据并写入数据库的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • golang使用go test输出单元测试覆盖率的方式

    golang使用go test输出单元测试覆盖率的方式

    单元测试覆盖率是衡量代码质量的一个重要指标,重要的代码文件覆盖率应该至少达到80%以上,Java 可以通过JaCoCo 统计覆盖率,那么go 项目如何进行代码覆盖率测试呢,本文将给大家详细的介绍一下golang使用go test输出单元测试覆盖率的方式,需要的朋友可以参考下
    2024-02-02
  • go 生成器模式的具体使用

    go 生成器模式的具体使用

    生成器是一种创建型设计模式,使你能够分步骤创建复杂对象,本文主要介绍了go生成器模式的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • GO利用channel协调协程的实现

    GO利用channel协调协程的实现

    本文主要介绍了GO利用channel协调协程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • go语言按显示长度截取字符串的方法

    go语言按显示长度截取字符串的方法

    这篇文章主要介绍了go语言按显示长度截取字符串的方法,涉及Go语言操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 利用go-zero在Go中快速实现JWT认证的步骤详解

    利用go-zero在Go中快速实现JWT认证的步骤详解

    这篇文章主要介绍了如何利用go-zero在Go中快速实现JWT认证,本文分步骤通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-10-10
  • Go语言实现的web爬虫实例

    Go语言实现的web爬虫实例

    这篇文章主要介绍了Go语言实现的web爬虫,实例分析了web爬虫的原理与Go语言的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go中strings包的基本使用示例代码

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

    本文详细介绍了Go语言中strings包的基本使用方法,包括字符串的前缀、后缀判断,字符串包含、索引查找、字符串替换、计数、重复、大小写转换、修剪、分割、拼接以及数据类型转换等功能,示例代码丰富,适合初学者和需要使用字符串处理功能的开发者参考学习
    2024-10-10

最新评论