我正在關注大猩猩提供的聊天示例。我仍然可以解組發送的 json 數據。我應該在readPump():func (c *ChatClient) readPump() { defer func() { c.hub.unregisterChan <- c c.conn.Close() }() c.conn.SetReadLimit(maxMessageSize) c.conn.SetReadDeadline(time.Now().Add(pongWait)) c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil }) for { _, message, err := c.conn.ReadMessage() // =================MY CODE START============= var comment Comment err = c.conn.ReadJSON(comment) if err != nil { LogErr("readjson()", err) break } err = json.Unmarshal(message, comment) if err != nil { LogErr("readjson()", err) break } // =================MY CODE END============= if err != nil { if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) { LogErr("IsUnexpectedCloseError()", err) } break } message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1)) c.hub.broadcastChan <- message }}或在writePump()func (c *ChatClient) writePump() { ticker := time.NewTicker(pingPeriod) defer func() { ticker.Stop() c.conn.Close() }() for { select { case message, ok := <-c.send: c.conn.SetWriteDeadline(time.Now().Add(writeWait)) // CLOSE if !ok { c.conn.WriteMessage(websocket.CloseMessage, []byte{}) return } w, err := c.conn.NextWriter(websocket.BinaryMessage) if err != nil { LogErr("c.conn.NextWriter", err) return }LogErr() 方法不打印任何消息。完全迷失在這里。
1 回答

慕尼黑5688855
TA貢獻1848條經驗 獲得超2個贊
應用程序通過循環在每次迭代中讀取兩條消息,并嘗試將這兩條消息解組為comment. 只讀一條消息。
應用程序調用ReadJSON不Unmarshal正確,從這些函數返回的錯誤解釋了原因:應用程序試圖解組為非指針。
應用程序還將消息的原始字節發送到通道。看起來它可能是您正在復制的任何內容的剩余部分,因此我將在答案的其余部分忽略它。
這是固定循環:
for {
var comment Comment
err = c.conn.ReadJSON(&comment)
if err != nil {
if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
LogErr("IsUnexpectedCloseError()", err)
}
break
}
// Do something with comment
}
- 1 回答
- 0 關注
- 155 瀏覽
添加回答
舉報
0/150
提交
取消