質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

2285閲覧

『Go言語によるWebアプリケーション開発』の1章におけるチャットアプリケーションがうまく起動できません

shuhey

総合スコア18

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

1クリップ

投稿2016/07/22 06:49

編集2016/07/22 09:32

現在、上記の本を進めているのですが、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() }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/07/22 09:04

いくつか教えてください。(1) Go実行環境のバージョンを教えてください。(2) clientという型はgorilla/websocketには含まれていないようです。本の中で以前に出てきていませんか?
shuhey

2016/07/22 09:34 編集

ありがとうございます。 (1)ですが、実行環境は以下の通りです。 OS OS X El Capitan Golang go1.6.2 (2)ですが、他にclient.goというファイルがあります。質問の方に追記いたします。
guest

回答1

0

自己解決

申し訳ございません。。。
htmlのコードミスが原因でした。。。

投稿2016/07/22 09:42

shuhey

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問