Once you've upgraded/hijacked a websocket connection I don't believe you should close it until you're done using it.
The defer ws.Close() you've got in the wsHandler is doing that, but you're continuing to use the websocket connection inside your goroutine.
I believe what you're going to want to do instead is something like calling ws.ReadMessage() in a loop inside and only call ws.Close() once you're done with that particular websocket connection.