2015-11-24 4 views
0

ПроблемаGolang Работа с типами

мне нужна помощь, работая с типами в Golang, я получаю супер замешательстве. Я пытаюсь изменить пример чата websocket от Gorilla, и я хочу перейти в JSON и обработать его соответствующим образом. Мне нужно установить, например, пользователя, и отправить сообщение на веб-узел.

В текущей реализации все, что он делает, это получить строку и передать ее обратно, передав ее всем подключенным клиентам.

Например, я хочу иметь возможность установить структуру данных следующим образом и обрабатывать ее по-разному.

входящий пользователь будет:

{ 
    '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 
} 

данных

Таким образом, приведенный выше код работает для одиночных строк, поскольку весь сервер выполняет передачу входящего сообщения от любого клиента ко всем. Но я хочу иметь возможность сохранять пользователей и отправлять список активных пользователей обратно клиенту вместе с новым сообщением.

Для этого, на мой взгляд, мне придется обрабатывать разные входящие сообщения по-разному. Я попытался unmarchal в Incomming 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 

ответ

3

К сожалению, я был немного глупо с этим. message уже является интерфейсом байтового типа. Я не правильно кодировал данные на интерфейсе HTML/JavaScript перед отправкой его на сервер.

То, что сработало было stringifying его в интерфейсе:

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 
+1

Не стесняйтесь, чтобы принять свой собственный ответ, то. –

+0

Будем благодарны, вам нужно подождать 48 часов, хотя :-D –

Смежные вопросы