Clon este repositorio
Monte el repositorio y ejecute este comando para instalar dependencias
make setup
make run
localhost:8080 Después de ejecutar el servidor, abra su cliente WebSocket. Si no tiene ninguno, pruebe la extensión Websocket King para Chrome.
Conéctese a ws://localhost:8080/socket , será recibido por el servidor.
Server: Welcome! Your ID is f0ab664a-5af3-4f8d-8afe-eb93085267e4
{
"action": "subscribe",
"topic": "world"
}
{
"action": "publish",
"topic": "world",
"message": "Hello world!"
}
{
"action": "unsubscribe",
"topic": "world"
}
Puede que esté preguntando "¿Por qué debería usar WebSocket en lugar de API REST"?
REST API usa HTTP, que solo puede enviar respuesta una vez por solicitud.
Mientras tanto, WebSocket se puede utilizar para la comunicación bidireccional persistente sin la necesidad de restablecer la conexión cada vez.
Esto puede ser útil en algún escenario como chatear o pub-su.
Aquí está el diagrama para visualizar la diferencia entre HTTP y WebSocket.

Este diagrama de flujo describe cómo funciona este servidor. 
cmd
└── main
└── main.go
internal
└── websocket
└── handler.go
└── model.go
└── server.go
Main.go : el archivo principal que se ejecutará.
Handler.go : maneja la conexión abierta/cerrada y pase el mensaje al servidor.
Model.go : almacena los modelos utilizados por el servidor.
Server.go : ejecuta una acción específica de acuerdo con el mensaje del cliente, también contiene funciones que necesitan el servidor para funcionar correctamente como un servidor WebSocket.
Este repositorio está lejos de ser ideal. Es solo una prueba de concepto.
Si bien este repositorio está cerca de un pub-sub, aún se puede usar para un servidor de chat.
Por ejemplo, podemos agregar una función en el socket conectado para que el cliente se suscriba automáticamente a su propia identificación como tema. Otros clientes usarán la identificación de esos usuarios como tema para publicar un mensaje.
He intentado construir dicha solución combinada con autorización para evitar que otros usuarios se suscriban a la identificación de otros y funciona.
Este repositorio está inspirado en Golang-Pubsub por @tabvn