Иногда вам нужно быстро проверить синтаксис, протестировать идею или показать коллеге пример кода.
Развернуть локальное окружение не всегда удобно.
Онлайн-площадки позволяют компилировать и запускать Go-код прямо в браузере.
Рассмотрим два основных инструмента и определим, когда использовать каждый из них.
Go Playground — официальная песочница
The Go Playground — это официальный онлайн-компилятор от команды Go. Минималистичный интерфейс, никаких излишеств.
// You can edit this code!
// Click here and start typing.
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
Как работает:
Go Playground принимает ваш код, проверяет его через go vet, компилирует, линкует и запускает в изолированной среде.
Результат возвращается в браузер.
Если в коде есть тесты (и нет функции main), он запускает тесты.
Бенчмарки не поддерживаются из-за ограничений ресурсов.
Что умеет:
- Компиляция и запуск кода (использует последнюю стабильную версию Go)
- Поддержка большей части стандартной библиотеки (с некоторыми исключениями)
- Запуск тестов и примеров
- Генерация короткой ссылки для шаринга кода (например,
go.dev/play/p/abc123) - Форматирование через встроенный
gofmt(кнопка Format) - Встроенные примеры из документации Go
Ограничения:
- Программа может взаимодействовать с внешним миром только через запись в
stdoutиstderr - Все сетевые запросы завершаются ошибкой (например:
http.Getзавершается сconnect: no route to host) - Время в playground всегда начинается с
2009-11-10 23:00:00 UTC(это делает вывод детерминированным и упрощает кэширование) - Ограничено время выполнения, использование CPU и памяти
- Сетевые операции недоступны
Когда использовать:
- для быстрой проверки, синтаксиса или встроенной функции
- Хочется поделиться минимальным воспроизводимым примером в issue или на форуме
- Демонстрация базовых концепций языка
Compiler Explorer (Godbolt) — смотрим под капот
Compiler Explorer (он же Godbolt) — это не совсем playground в классическом понимании. Это инструмент для анализа того, как компилятор превращает код в машинные инструкции.
Выбираете язык Go, компилятор и нужную версию, пишете код — и видите рядом результирующий ассемблер. Любое изменение кода пересобирает бинарник и обновляет ассемблерный вывод.
Пример с площадки
// Type your code here, or load an example.
package p
func square(x int) int {
return x * x
}
Справа увидишь что-то вроде:
TEXT command-line-arguments.square(SB), NOSPLIT|NOFRAME|ABIInternal, $0-8
FUNCDATA $0, gclocals·FzY36IO2mY0y4dZ1+Izd/w==(SB)
FUNCDATA $1, gclocals·FzY36IO2mY0y4dZ1+Izd/w==(SB)
FUNCDATA $5, command-line-arguments.square.arginfo1(SB)
FUNCDATA $6, command-line-arguments.square.argliveinfo(SB)
PCDATA $3, $1
IMULQ AX, AX
RET
Зачем это нужно:
- Оптимизация производительности — видно, как компилятор оптимизирует (или не оптимизирует) код
- Понимание внутреннего устройства — как работают горутины, интерфейсы, closures на уровне инструкций
- Сравнение версий компилятора — можно запустить один и тот же код на разных версиях Go и посмотреть разницу в генерируемом коде
- Отладка багов в критичных секциях — иногда проблема кроется в неожиданной компиляции
Настройки, которые стоит знать:
- Можно использовать большинство флагов компилятора
- Выбрать архитектуру (amd64, arm64, и т.д.) и конкретную версию компилятора
Когда использовать:
- Пишешь высоконагруженный код и хочешь понять, что происходит на низком уровне
- Изучаешь, как работают внутренности Go
- Сравниваешь производительность разных подходов
Сравнение инструментов
| Инструмент | Внешние пакеты | Ассемблер | Лучше всего для |
|---|---|---|---|
| Go Playground | ✅ (частично) | ❌ | Быстрые примеры, шаринг |
| Compiler Explorer | ❌ | ✅ | Анализ компиляции, оптимизация |
Финальные рекомендации
Используй Go Playground, если:
- Тебе нужно показать пример из документации или stackoverflow
- Хочешь быстро проверить синтаксис или поведение stdlib
- Отправляешь воспроизводимый пример в issue на GitHub
Используй Compiler Explorer, если:
- Интересно, как код превращается в ассемблер
- Оптимизируешь критичные участки кода
- Изучаешь внутреннее устройство Go
Бонусы
Автоматизация Go Playground:
Можно использовать не только руками, но и автоматически:
curl -X POST https://play.golang.org/share \
--data-binary 'package main
import "fmt"
func main() {
fmt.Println("Hello")
}'
Возвращает ID, по которому доступен код: https://go.dev/play/p/{ID}
Пасхалка:
Время в playground всегда начинается с 2009-11-10 23:00:00 UTC потому что это дата публичного запуска Go.
Больше об истории языка можно прочитать в статье Go когда появился: подробная история
FAQ
Можно ли запускать долгие программы в онлайн-компиляторах?
Нет, все playground-среды ограничивают время выполнения, использование CPU и памяти. Для долгих задач используй локальное окружение или Docker-контейнер.Безопасно ли вставлять приватный код в онлайн-компиляторы?
Нет. Всё, что ты вставляешь в playground, потенциально видно другим (особенно если генерируешь ссылку для шаринга). Для приватного кода используй локальную машину.Почему мой код работает локально, но не в playground?
Скорее всего, ты используешь внешние зависимости, сетевые вызовы или части стандартной библиотеки, которые недоступны в песочнице. Официальный playground ограничивает взаимодействие с внешним миром — программа может писать только в stdout и stderr. Попробуй запуск программы в локальном окружении.Почему в playground всегда одно и то же время?
В Go Playground время всегда начинается с2009-11-10 23:00:00 UTC (дата первого коммита в Go). Это делает вывод программ детерминированным, что упрощает кэширование результатов и делает примеры воспроизводимыми. Если твоя программа зависит от реального времени — тестируй локально.Зачем смотреть на ассемблер, если я пишу на Go?
Понимание низкоуровневой реализации помогает писать более эффективный код. Например, можно увидеть, что компилятор не заинлайнил функцию, которая, по твоему мнению, должна была встроиться. Или обнаружить лишние аллокации в горячем пути.Теги: