如果没有 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
}
如果您只需要一条消息,请移除循环。
我想从服务器读取完整的响应,但我不知道它的准确大小。
我希望它能起作用:
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
}
如果您只需要一条消息,请移除循环。