現在、上記の本を進めているのですが、1章のチャットアプリケーションがうまく起動できません。
githubからサンプルコードをcloneして実行をしたら本のとおりに実行できたので、恐らくコードに問題があると思います。
ビルドした際に"label default denied and not used"とエラーを起こしていますが、エラーが発生する原因がわかりません。
見直してもどこに問題があるのかわかりません。
もしわかる方がいたらアドバイスいただけないでしょうか。
宜しくお願いします。
以下にソースコードを載せておきます。
package main import ( "log" "net/http" "github.com/gorilla/websocket" ) type room struct { // forwardは他のクライアントに転送するためのメッセージを保持するチャネルです。 forward chan []byte // joinはチャットルームに参加しようとしているクライアントのためのチャネルです join chan *client // leaveはチャットルームから退室しようとしているクライアントのためのチャネルです leave chan *client // clientには在室している全てのクライアントが保持されます clients map[*client]bool } // newRoomはすぐに利用できるチャットルームを生成して返します。 func newRoom() *room { return &room{ forward: make(chan []byte), join: make(chan *client), leave: make(chan *client), clients: make(map[*client]bool), } } func (r *room) run() { for { select { case client := <-r.join: //参加 r.clients[client] = true case client := <-r.leave: //退室 delete(r.clients, client) close(client.send) case msg := <-r.forward: //全てのクライアントにメッセージを転送 for client := range r.clients { select { case client.send <- msg: //メッセージを送信 dafault: //送信に失敗 delete(r.clients, client) close(client.send) } } } } } const ( socketBufferSize = 1024 messageBufferSize = 256 ) var upgrader = &websocket.Upgrader{ReadBufferSize: socketBufferSize, WriteBufferSize: socketBufferSize} func (r *room) ServeHTTP(w http.ResponseWriter, req *http.Request) { socket, err := upgrader.Upgrade(w, req, nil) if err != nil { log.Fatal("ServeHTTP:", err) return } client := &client{ socket: socket, send: make(chan []byte, messageBufferSize), room: r, } r.join <- client defer func() { r.leave <- client }() go client.write() client.read() }
ご質問にあったため、client.goファイルを追記いたします。
package main import ( "github.com/gorilla/websocket" ) // clientはチャットを行っている1人のユーザーを表します type client struct { // socketはこのクライアントのためのwebsocketです。 socket *websocket.Conn // sendはメッセージが送られるチャネルです。 send chan []byte // roomはこのクライアントが参加しているチャットルームです。 room *room } func (c *client) read() { for { if _, msg, err := c.socket.ReadMessage(); err == nil { c.room.forward <- msg } else { break } } c.socket.Close() } func (c *client) write() { for msg := range c.send { if err := c.socket.WriteMessage(websocket.TextMessage, msg); err != nil { break } } c.socket.Close() }
回答1件
あなたの回答
tips
プレビュー