Also worth noting, although probably not a huge deal, this isn't guaranteed to print out the chat messages in the same order that they are broadcast to clients. Each Client runs concurrently, and the world broadcast channel is buffered, so you could have a situation like

    [Client 1] c.world.Broadcast <- m
    [Client 2] c.world.Broadcast <- m
    [Client 2] log.Println("[CHAT]", m.ID, m.Message)
    [Client 1] log.Println("[CHAT]", m.ID, m.Message)

Obviously, this is quite unlikely to happen in practice, at least when we have small numbers of clients. It's up to you if you consider this worth fixing.