为了账号安全,请及时绑定邮箱和手机立即绑定

如何更改从 go 服务器返回数据的格式而不存储数据

如何更改从 go 服务器返回数据的格式而不存储数据

Go
神不在的星期二 2023-07-10 14:53:21
我正在对从通道获取的每个搜索结果进行编码,然后将其发送到响应编写器,然后刷新它,但这会发送如下数据:[{..}][{..}][{..}]this 作为具有单个值的多个数组但我要求发送数据的格式就像这样 [{..},{..},{..}]一个具有多个值的单个数组。如果我之前将数据存储在变量中,然后对整个数据进行编码,则可以完成此操作,但如果我存储它,则运行时内存不足。有什么方法可以将其转换为所需的格式而不存储它或如何解决我的内存问题。我在 4gb ram sles12 sp3 系统中运行我的 go 服务器ch := make(chan *ldap.SearchResult)//result := &ldap.SearchResult{}flusher, ok := w.(http.Flusher)if !ok {    http.Error(w, "Streaming unsupported!", http.StatusInternalServerError)    return}wg := sync.WaitGroup{}wg.Add(1)go func() {    for res := range ch {        resp := SearchResultToObjectType(res)        json.NewEncoder(w).Encode(resp)        flusher.Flush()        //result.Entries = append(result.Entries, res.Entries...)        //result.Controls = append(result.Controls, res.Controls...)        //result.Referrals = append(result.Referrals, res.Referrals...)    }    wg.Done()}()err = conn.SearchWithChannel(searchRequest, ch)wg.Wait()if err != nil {    json.NewEncoder(w).Encode(utils.ParseErrorToJson(err))    event.LogEventError(err, nil)}
查看完整描述

2 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

一种选择是手动构造外部 JSON 数组,使用如下内容:


first := true

w.Write([]byte("["))

for res := range ch {

    if not first {

        w.Write([]byte(","))

    }

    first = false

    ...

    json.NewEncoder(w).Encode(resp)

    ...

}

w.Write([]byte("]"))


查看完整回答
反对 回复 2023-07-10
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

假设这resp是一个包含单个元素的切片,则使用以下代码。该代码将切片元素包装在单个 JSON 数组中。


go func() {

    enc := json.NewEncoder(w)

    sep := []byte("")

    comma := []byte(",")

    w.Write([]byte("[")

    for res := range ch {

        w.Write(sep)

        sep = comma

        resp := SearchResultToObjectType(res)

        enc.Encode(resp[0])

        flusher.Flush()    

    }

    w.Write([]byte("]")

    wg.Done()

}()


查看完整回答
反对 回复 2023-07-10
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信