首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于net.Conn的读写

基于net.Conn的读写
EN

Stack Overflow用户
提问于 2013-11-23 17:50:53
回答 3查看 4.6K关注 0票数 0

我试图从net.Conn中读取和写入数据,但是由于我只读取([]字节)和写([]字节)函数,我发现很难找到帮助函数来完成这项工作。

我需要读和写以下类型:

  • uint64
  • 字节
  • uint32
  • UTF-8编码的字符串(首先是uint32长度和之后的字符串数据)

In

Go的包中有类似于Java的DataInputStream和DataOutputStream的东西吗?

感谢并致以问候

EN

回答 3

Stack Overflow用户

发布于 2013-11-23 19:28:38

您需要决定往返封送的格式。您的选择是要么滚动您自己的格式,要么使用已经制作的格式。我强烈推荐后者。

我以前在这里发布过关于go标准库中支持的许多格式的文章:https://stackoverflow.com/a/13575325/727643

如果您决定自己滚动,那么可以使用encoding/binary从[]字节中对uints进行编码和解码。它给了你小的和大大小小的选择。可以使用[]byte(str)将字符串直接转换为[]字节。最后,字节可以作为字节发送。不需要魔法。

我要强调的是,编造自己的格式通常是个坏主意。默认情况下,我倾向于使用JSON,只有在性能显著提高时才使用其他方法,而且我认为这样做是值得的。

票数 4
EN

Stack Overflow用户

发布于 2013-11-23 19:25:13

二进制编码的一个小秘密是您可以编写和读取整个数据结构:

来自游乐场

代码语言:javascript
复制
    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

票数 1
EN

Stack Overflow用户

发布于 2013-11-23 19:29:49

Fabrizio的回答很好,我想补充的是,您可能应该用缓冲的读取器和来自bufio包的缓冲作者包装您的套接字:

http://golang.org/pkg/bufio/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20165768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档