2 回答
TA贡献1795条经验 获得超7个赞
管道缓冲区的限制因系统而异。例如,Mac OS X 默认使用 16384 字节的容量。
您可以使用此 bash 脚本来检查您的缓冲区容量:
M=0; while printf A; do >&2 printf "\r$((++M)) B"; done | sleep 999
所以它与 go 无关,因为我试图将您的代码更改为从文件和 Unmarshal 中读取并且它有效:
func main() {
reader, err := os.Open("test-not-working.json")
if err != nil {
panic(err)
}
var res response
decoder := json.NewDecoder(reader)
err = decoder.Decode(&res)
if err != nil {
panic(err)
}
fmt.Println(res.Content)
}
TA贡献1818条经验 获得超8个赞
这是因为您的操作系统的管道缓冲区限制为 65536 字节。因此,该os.Stdin.Read(...)函数一次可以读取 65536 个字节。
您可以使用这个简单的替换来修复您的代码:
n, err := io.ReadFull(reader, received)
还有你的错误:
msg, err := Receive(os.Stdin)
if err != nil {
panic(err)
}
你比较过err,nil但你没有比较msg过nil。但是由于您已经读取了 65532 ( 65536 - 4) 个字节,因此func Receive(...)返回的nil, nil.
要解决此问题,您的函数Receive(...)不应返回nil, nil。
- 2 回答
- 0 关注
- 204 浏览
添加回答
举报