猿问

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

我正在对从通道获取的每个搜索结果进行编码,然后将其发送到响应编写器,然后刷新它,但这会发送如下数据:


[{..}]

[{..}]

[{..}]

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)

}


神不在的星期二
浏览 136回答 2
2回答

杨魅力

一种选择是手动构造外部 JSON 数组,使用如下内容:first := truew.Write([]byte("["))for res := range ch {    if not first {        w.Write([]byte(","))    }    first = false    ...    json.NewEncoder(w).Encode(resp)    ...}w.Write([]byte("]"))

侃侃尔雅

假设这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()}()
随时随地看视频慕课网APP

相关分类

Go
我要回答