我试图从net.Conn中读取和写入数据,但是由于我只读取([]字节)和写([]字节)函数,我发现很难找到帮助函数来完成这项工作。
我需要读和写以下类型:
In
Go的包中有类似于Java的DataInputStream和DataOutputStream的东西吗?
感谢并致以问候
发布于 2013-11-23 19:28:38
您需要决定往返封送的格式。您的选择是要么滚动您自己的格式,要么使用已经制作的格式。我强烈推荐后者。
我以前在这里发布过关于go标准库中支持的许多格式的文章:https://stackoverflow.com/a/13575325/727643
如果您决定自己滚动,那么可以使用encoding/binary从[]字节中对uints进行编码和解码。它给了你小的和大大小小的选择。可以使用[]byte(str)将字符串直接转换为[]字节。最后,字节可以作为字节发送。不需要魔法。
我要强调的是,编造自己的格式通常是个坏主意。默认情况下,我倾向于使用JSON,只有在性能显著提高时才使用其他方法,而且我认为这样做是值得的。
发布于 2013-11-23 19:25:13
二进制编码的一个小秘密是您可以编写和读取整个数据结构:
来自游乐场
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
}注意您可以使用的类型:
来自二进制/编码文档:
固定大小的值要么是固定大小的算术类型(int8、uint8、int16、float32、complex64、.)或只包含固定大小值的数组或结构。
请注意,您必须使用[10] byte,而不能使用[]byte
发布于 2013-11-23 19:29:49
Fabrizio的回答很好,我想补充的是,您可能应该用缓冲的读取器和来自bufio包的缓冲作者包装您的套接字:
http://golang.org/pkg/bufio/
https://stackoverflow.com/questions/20165768
复制相似问题