Go — это компилируемый или интерпретируемый язык?

Ответ

Go — это статически компилируемый язык. Исходный код на Go компилируется непосредственно в нативный машинный код для целевой платформы (ОС и архитектуры). В результате получается один исполняемый бинарный файл, который не требует для запуска виртуальной машины или интерпретатора.

Пример компиляции:

// main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, compiled world!")
}

Команда для компиляции:

go build main.go

Эта команда создаст исполняемый файл main (или main.exe в Windows).

Ключевые особенности компиляции в Go:

  • Статическая линковка: По умолчанию Go создает статически скомпонованные бинарные файлы. Это означает, что все необходимые библиотеки включаются в один исполняемый файл, что сильно упрощает развертывание приложения (деплой).
  • Кросс-компиляция: Go из коробки поддерживает кросс-компиляцию. Можно легко собрать исполняемый файл для другой операционной системы и архитектуры, просто указав переменные окружения GOOS и GOARCH. Например, сборка под Linux из macOS: GOOS=linux GOARCH=amd64 go build main.go
  • Команда go run: Эта команда является удобной оберткой, которая сначала компилирует код во временный файл, а затем запускает его. Это удобно для быстрой разработки, но для продакшена всегда используется go build.

Ответ 18+ 🔞

А, Го, блядь! Ну это ж классика, ёпта! Язык, который берёт и нахуяривает тебе один жирный бинарник, без всяких там виртуальных машинок, интерпретаторов и прочей ебли. Чистый, блядь, машинный код, как в старые добрые времена, только без этих твоих ассемблерных страданий.

Смотри, вот тебе кусок кода, обычный такой, приветственный:

// main.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, compiled world!")
}

Чтобы из этой писанины получить что-то осязаемое, делаешь в консоли хуйню:

go build main.go

И всё, сука! Никаких танцев с бубном. Появится файлик main (или main.exe на винде, там, где кнопка «Пуск»), который можно хоть на сервер закинуть, хоть другу в зубы всучить — он запустится везде, где подходящая платформа. Никаких зависимостей, блядь, не нужно — всё уже внутри, как коньяк в бомже.

А теперь, блядь, соль и перец, почему это овердохуище удобно:

  • Статическая линковка, ёбта! Это когда все библиотеки, все плюшки, всё, что нужно твоей проге, засовывается прямо в этот бинарник. Получается такой цифровой мужик-оркестр, самодостаточный, блядь. Закинул на сервер — и он работает. Никаких «ой, а где у вас libc версии 2.31?». Пиздец как удобно для деплоя, в рот меня чих-пых!
  • Кросс-компиляция из коробки. Сидишь ты на маке, красивый такой, а надо собрать под линукс на каком-нибудь сервере-уродце. Да не вопрос! Выдаёшь в терминале: GOOS=linux GOARCH=amd64 go build main.go И всё, блядь! Получаешь бинарник под линукс, как будто так и надо. Никаких кросс-компиляторных мук, всё уже в компиляторе Го, который, видимо, сам от себя охуел от такой функциональности.
  • Команда go run. Это для ленивых, типа меня, когда надо быстро проверить, работает ли твой гениальный код или ты опять какую-то хуйню написал. Она компилирует всё во временный файл, запускает и удаляет. Но для прода, понятное дело, используем go build, чтобы получить этот монолитный, блядь, артефакт, который потом хоть в космос запускай.

Вот и весь сказ, блядь. Никакой магии, просто инженерная мысль, доведённая до ума, а не как обычно — накосячить и замутить слона из говна и палок.