Для статических файлов — http.ServeFile или http.FileServer. Для динамически генерируемых — ставишь Content-Type и Content-Disposition headers, потом пишешь в ResponseWriter через io.Copy. Для больших файлов важно стримить, а не загружать целиком в память. Content-Disposition: attachment заставляет браузер скачивать а не открывать.