如果没有 EOF,从 Golang 中的服务器读取 Unix Socket 响应的最佳方法是什么

Whats the best way to read Unix Socket response from server in Golang if there is no EOF

我想从服务器读取完整的响应,但我不知道它的准确大小。

我希望它能起作用:

message, err := ioutil.ReadAll(conn)

但是服务器没有发送 EOF,所以这条语句挂起。

我知道它是一个 JSON 响应,所以我可以读取数据直到最后 },但这似乎不是完成它的最佳方式。

阅读完整回复的最佳做法是什么?


更新:

一段时间后我发现可以这样:

var m map[string]interface{}
d := json.NewDecoder(conn)
d.Decode(&m)

for key, value := range m {
    fmt.Print(key)
    fmt.Print(" : ")
    fmt.Print(value)
    fmt.Print("\n")
    switch vv := value.(type) {
    case map[string]interface{}:
        for k, v := range vv {
            fmt.Print(k)
            fmt.Print(" : ")
            fmt.Print(v)
            fmt.Print("\n")
        }
    }
}

你想要一个 json.Decoder。解码器旨在读取 JSON 对象的流。它从流中读取直到接收到一个完整的对象,然后将其解组到提供的对象指针上。

示例:

package main

import (
    "encoding/json"
    "fmt"
    "io"
)

func main() {
    pr, pw := io.Pipe()
    go pw.Write([]byte(`{"foo":"bar"}`))
    var data map[string]string
    json.NewDecoder(pr).Decode(&data)
    fmt.Printf("Data: %v\n", data)
}

https://play.golang.org/p/JQMXGzrDAH-

输出:

Data: map[foo:bar]

使用 json.Decoder。以下是阅读多条消息的方法:

 d := json.NewDecoder(conn)
 for {
     var m message // <-- use whatever type is appropriate for your app
     err := d.Decode(&m)
     if err == io.EOF {
         break
     } else if err != nil {
         // handle error
     }
     // do something with m
}

如果您只需要一条消息,请移除循环。