Ответ
Go — компилируемый, статически типизированный язык, разработанный в Google с акцентом на простоту, эффективность и встроенную поддержку конкурентности.
1. Простой и читаемый синтаксис: Минимум ключевых слов, отсутствие классов и наследования. Структуры и интерфейсы.
type User struct {
ID int
Name string
}
// Интерфейс декларативно определяет контракт
type Speaker interface {
Speak() string
}
// Структура автоматически удовлетворяет интерфейсу, если реализует все его методы
func (u User) Speak() string {
return "Hello, I'm " + u.Name
}
2. Встроенная конкурентность на основе модели CSP (Communicating Sequential Processes):
- Горутины (Goroutines): Легковесные потоки, управляемые рантаймом Go. Запускаются с помощью
go. - Каналы (Channels): Типизированные конвейеры для безопасной коммуникации между горутинами.
package main import ( "fmt" "time" ) func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { // Чтение из канала fmt.Printf("worker %d started job %dn", id, j) time.Sleep(time.Second) results <- j * 2 // Отправка результата в канал } } func main() { jobs := make(chan int, 5) results := make(chan int, 5) // Запуск 3 горутин-воркеров for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // Отправка 5 задач for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // Сигнал о завершении задач // Сбор результатов for r := 1; r <= 5; r++ { <-results } }
3. Быстрая компиляция и статическая линковка: Исполняемый файл содержит всё необходимое, что упрощает деплой.
4. Современные возможности: Поддержка дженериков (с версии 1.18), встроенное тестирование, форматирование кода утилитой gofmt.
Типичное применение: Бэкенд-микросервисы (высокий RPS), сетевое программирование, CLI-утилиты, облачная инфраструктура (Docker, Kubernetes написаны на Go).
Сравнение с Java: Go проще в изучении, компилируется в нативный бинарник, имеет более простую модель конкурентности (горутины vs. потоки), но обладает менее развитой экосистемой библиотек и фреймворков.