Разобрался. Кратенько должно быть вот так:
func main() {
//создаем карту с пользователями
users := make(map[string]*websocket.Conn)
http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {
conn, _ := upgrader.Upgrade(w, r, nil)
//получаем id подключенного пользователя, который приходит в get параметре
userId := r.URL.Query()["user"][0]
// В консоли показываем какой пользователь подключился
fmt.Printf("User %s is connected \n", string(userId))
//заносим в карту текущее подключение с ключем = id пользователя
users[userId] = conn
Вот так можно передать в сокет сообщение для конкретного пользователя
users[userId].WriteJSON(string(msg))
А вот так для всех разом
for _, user := range users {
user.WriteJSON(string(msg))
}