我正在尝试从net.Conn读取和写入数据,但由于我只有Read([] byte)和Write([] byte)函数,我发现很难找到辅助函数来完成这项工作。
我需要阅读和编写以下类型:
简而言之
Go的软件包中是否有类似Java的DataInputStream和DataOutputStream?
谢谢和问候
答案 0 :(得分:4)
您需要决定要编组的格式。您的选择是滚动您自己的格式或使用已经制作的格式。我强烈推荐后者。
我之前发布了go标准库中支持的许多格式:https://stackoverflow.com/a/13575325/727643
如果您决定自己滚动,则可以使用encoding/binary
从[]字节对uints进行编码和解码。它为您提供了小端和大端的选项。可以使用[]byte(str)
将字符串直接转换为[]字节。最后,字节可以作为字节发送。不需要魔法。
我要强调的是,制作自己的格式通常是一个坏主意。我倾向于默认使用JSON,只有当我能获得显着的性能提升时才使用其他JSON,我相信值得花时间去做。
答案 1 :(得分:1)
二进制编码的一个小秘诀是你可以编写和读取整个数据结构:
buf := new(bytes.Buffer)
err := binary.Write(buf, binary.LittleEndian, &MyMessage{
First: 100,
Second: 0,
Third: 100,
Message: MyString{0, [10]byte{'H', 'e', 'l', 'l', 'o', '\n'}},
})
if err != nil {
fmt.Printf("binary.Read failed:", err)
return
}
// <<--- CONN -->>
msg := new(MyMessage)
err2 := binary.Read(buf, binary.LittleEndian, msg)
if err2 != nil {
fmt.Printf("binary.Read failed:", err2)
return
}
注意您可以使用的那种类型:
来自binary/encoding docs:
固定大小的值是固定大小的算术类型(int8,uint8,int16,float32,complex64,...)或仅包含固定大小值的数组或结构。
请注意,您必须使用[10] byte
,并且无法使用[]byte
答案 2 :(得分:0)
Fabrizio的答案很好,我想补充一点,你应该用bufio包中的缓冲读卡器和缓冲写入器包装你的套接字: