Golang使用类型

时间:2015-11-24 18:22:51

标签: json go types websocket gorilla

问题

我需要一些帮助处理Golang中的类型,我感到非常困惑。我试图改变Gorilla的websocket聊天示例,我想传入JSON并相应地处理它。我需要能够设置例如用户,并向websocket发送消息。

在当前的实现中,它所做的只是接收一个字符串,并通过将其广播到所有连接的客户端来中继它。

例如,我希望能够如下设置数据结构并以不同方式处理它。

传入的用户将是:

{
  'type': "user",
  'value': "John Doe"
}

Incomming消息将是:

{
  'type': "message",
  'value': "Hi There, how are you?"
}

请参阅以下代码: https://github.com/gorilla/websocket/blob/master/examples/chat/conn.go#L52

for {
    _, message, err := c.ws.ReadMessage()
    if err != nil {
        break
    }
    h.broadcast <- message
}

数据

因此上面的代码适用于单个字符串,因为所有服务器都将传入的消息从任何客户端传递给所有客户端。但我希望能够保存用户,并将活动用户列表与新消息一起发送回客户端。

要做到这一点,在我看来,我需要以不同的方式处理不同的传入消息。我试图取消对message的打算,但是当我打印出类型时,就是这样:

2015/11/24 20:03:10 []uint8

问题

如何阅读此输入流,并将其解组为JSON?这是我添加到该部分的调试:

for {
    _, dataString, err := c.ws.ReadMessage()
    if err != nil {
        break
    }

    log.Println(reflect.TypeOf(dataString))

    var data MessageData
    err = json.Unmarshal(dataString, &data)
    log.Println(data.Type)
    log.Println(data.Value)

    if err != nil {
        log.Println(err)
    }

    h.broadcast <- dataString
}

返回

2015/11/24 20:03:10 []uint8
2015/11/24 20:03:10 
2015/11/24 20:03:10 

1 个答案:

答案 0 :(得分:3)

抱歉,我对此有点愚蠢。 message已经是字节类型接口。在将数据发送到后端之前,我没有正确编码HTML / JavaScript前端的数据。

在前端进行字符串处理有效:

var data = {};
data.type = "user";
data.value = user.val();
conn.send(JSON.stringify(data));
JSON.stringify(data)

然后我能够解组JSON:

2015/11/24 20:36:04 {user fhgfhg}
2015/11/24 20:36:04 user
2015/11/24 20:36:04 fhgfhg