Ответ
Плюсы:
- Простота и лаконичность: У языка небольшой набор ключевых слов и простой синтаксис, что позволяет быстро начать писать код и легко его читать.
- Высокая производительность: Go — компилируемый язык со статической типизацией. Он компилируется напрямую в машинный код, что обеспечивает скорость, сравнимую с C++. Встроенный сборщик мусора (GC) эффективно управляет памятью.
- Встроенная поддержка конкурентности: Горутины и каналы являются частью языка, что делает написание конкурентных и параллельных программ значительно проще, чем во многих других языках.
- Кросс-компиляция: Go позволяет легко компилировать приложения под разные операционные системы и архитектуры из одной кодовой базы (например, с macOS собрать бинарный файл для Linux/Windows).
- Богатая стандартная библиотека: Включает мощные пакеты для работы с сетью (HTTP/2), JSON, криптографией, тестированием и многим другим, что позволяет создавать полноценные приложения без множества сторонних зависимостей.
Минусы:
- Управление зависимостями (исторически): До появления Go Modules управление версиями пакетов было проблемой. Сейчас ситуация значительно улучшилась, но экосистема все еще моложе, чем у Java или Python.
- Обработка ошибок: Явный возврат и проверка ошибок (
if err != nil
) делает код более многословным по сравнению с использованием исключений (try-catch). Однако это также делает поток управления более предсказуемым. - Дженерики (обобщенное программирование): Были добавлены только в версии 1.18. Экосистема все еще адаптируется к их использованию, и их реализация имеет некоторые ограничения по сравнению с другими языками.
- Отсутствие классического ООП: В Go нет классов и наследования. Вместо этого используется композиция и интерфейсы, что требует иного подхода к проектированию.
Пример: Простой HTTP-сервер, демонстрирующий стандартную библиотеку
package main
import (
"fmt"
"log"
"net/http"
)
// helloHandler — обработчик HTTP-запросов
func helloHandler(w http.ResponseWriter, r *http.Request) {
// r.URL.Path содержит путь из запроса
fmt.Fprintf(w, "Привет! Вы запросили: %sn", r.URL.Path)
}
func main() {
// Регистрируем наш обработчик для всех URL
http.HandleFunc("/", helloHandler)
fmt.Println("Сервер запущен на http://localhost:8080")
// Запускаем сервер на порту 8080
// http.ListenAndServe блокирует выполнение, ожидая запросы
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}