実は以前にも似たような質問をしているのですが・・・
GolangでWebsocketで非同期でReceive, Sendをする

下記のコードを実行するとSender Error use of closed network connection...と表示されます。
sync.WaitGroupを使って全てのwsへのSendが終わるまで待って、もし、err != nilならconnectionの一覧として使っているconnsから削除しています。

このエラーを解決するにはどうすればいいのでしょうか? また なぜ起こるのでしょうか?


package main

import (
    "fmt"
    "golang.org/x/net/websocket"
    "net/http"
    "sync"
)

type Message struct {
    Name    string
    Message string
}

var conns = make(map[*websocket.Conn]bool)

var wg sync.WaitGroup

func chat_receiver(ws *websocket.Conn, msg *Message) {
    fmt.Println("Chat Receiver")
    conns[ws] = true
    err := websocket.JSON.Receive(ws, msg)
    fmt.Println("Received data:", msg)
    if err != nil {
        fmt.Println("Receiver Error:", err)
        ws.Close()
        delete(conns, ws)
    }
    fmt.Println("Data received")

}

func chat_sender(msg *Message) {
    fmt.Println("Chat Sender")
    fmt.Println(conns)
    for ws, _ := range conns {
        wg.Add(1)
        go func(ws *websocket.Conn) {
            fmt.Println(ws)
            err := websocket.JSON.Send(ws, msg)
            fmt.Println("Message sent")
            if err != nil {
                fmt.Println("Sender Error:", err)
                ws.Close()
                delete(conns, ws)
            }
            defer wg.Done()
        }(ws)
        wg.Wait()
    }
}

func handler(ws *websocket.Conn) {
    var msg Message
    chat_receiver(ws, &msg)
    chat_sender(&msg)
}

func main() {
    http.Handle("/", http.FileServer(http.Dir(".")))
    http.Handle("/chat", websocket.Handler(handler))
    fmt.Println("serve on localhost:4283")
    err := http.ListenAndServe(":4283", nil)
    if err != nil {
        fmt.Println(err)
    }
}