【问题标题】:golang send and receive objectsgolang 发送和接收对象
【发布时间】:2023-10-26 23:45:01
【问题描述】:

我可以使用以下代码在 golang 中发送和接收字符串:

//send side
message.Buf.WriteTo(conn)

//receive side
message, err := bufio.NewReader(conn).ReadString('\n')
    if err != nil {
        panic(err)
    }
fmt.Print("Message from client: ", string(message))

但是,我想发送整个消息对象并在接收端接收它

类似:

//send side
message.WriteTo(conn)

//receive side
message,err :=bufio.NewReader(conn).ReadMessageObject()

我是 Golang 新手,任何指针都非常有帮助。

【问题讨论】:

  • 实际上有无数种“发送对象”的方法。你想用什么编码?

标签: object go send


【解决方案1】:

您首先要为您的消息声明一个类型。比如:

type Message struct {
    From      string
    To        string
    Text      string
    CreatedAt time.Time
}

然后您需要决定如何将新类型编码为字节/从字节解码,因为您可以通过网络发送的所有内容都是字节。 例如,您可以将消息发送为jsonxmlgob 等。您选择哪一个取决于您的要求,json 无处不在且可读,而gob 在另一个手快多了,至少我是这么听说的,我自己还没真正用过gob

例如,如果您选择json

// receive
var m Message
if _, err := json.NewDecoder(conn).Decode(&m); err != nil {
    panic(err)
}

// send
if err := json.NewEncoder(conn).Encode(m); err != nil {
    panic(err)
}

【讨论】:

  • 感谢您的样品。如果我有多个必须通过网络发送的对象?关于如何完成它的任何指示?
  • 您可以使用切片、映射、数组。这完全取决于您,jsongob 都可以很好地处理这些。
  • 我检查了地图和切片,使用两者都能够发送一组对象。但是,我也希望能够连续发送似乎不起作用的数据流。
  • 如果您打开一个新问题会更好。一个精确解释你想要达到的目标,你到目前为止的代码,什么有效,什么无效,你想要得到的结果和你实际得到的不想要的结果。