func handleChat(ws *websocket.Conn) { poster := func() int { for { since := board.QHead recv_msg, next := board.GetMessages(since) since = next for _, m := range recv_msg { timems := m.Time.Unix()*1000 + int64(m.Time.Nanosecond()/1000000) timeStr := fmt.Sprintf("%016x", timems) send_msg := timeStr + m.Text ws.WriteMessage(websocket.OpText, []byte(send_msg)) } } return 0 } fetcher := func() int { for { opcode, reader, err := ws.NextReader() if err != nil { break } switch opcode { case websocket.OpText: { msg, err := ioutil.ReadAll(reader) if err != nil { break } board.PostMessage(string(msg)) } case websocket.OpBinary: { msg, err := ioutil.ReadAll(reader) if err != nil { break } msgStr := fmt.Sprintf("%v", msg) board.PostMessage(string(msgStr)) } } } return 0 } sync_end := make(chan int) go func() { sync_end <- poster() }() fetcher() <-sync_end }