How to Build a Chat Application in Go with WebSockets

Web
Build a Go chat app by upgrading HTTP connections to WebSockets and broadcasting messages to all clients via a shared channel.

You build a Go chat app by creating an HTTP server that upgrades connections to WebSockets, broadcasting messages to all connected clients via a shared channel. Use the gorilla/websocket library to handle the upgrade and message loop, then run the server on a specific port.

package main

import (
	"log"
	"net/http"
	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{}
var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan string)

func handler(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil { return }
	defer conn.Close()
	clients[conn] = true
	for {
		_, message, err := conn.ReadMessage()
		if err != nil { break }
		broadcast <- string(message)
	}
}

func broadcaster() {
	for {
		msg := <-broadcast
		for client := range clients {
			if err := client.WriteMessage(websocket.TextMessage, []byte(msg)); err != nil {
				client.Close()
				delete(clients, client)
			}
		}
	}
}

func main() {
	go broadcaster()
	http.HandleFunc("/", handler)
	log.Fatal(http.ListenAndServe(":8080", nil))
}