Ответ
Кроссплатформенность в Go достигается за счет комбинации продуманного дизайна компилятора, стандартной библиотеки и системы сборки. Код на Go компилируется в нативный машинный код для целевой платформы.
Ключевые механизмы:
-
Кросс-компиляция по умолчанию
- Инструментарий Go позволяет компилировать проект для другой операционной системы и архитектуры процессора прямо из вашей рабочей среды. Это делается с помощью переменных окружения
GOOS
(целевая ОС) иGOARCH
(целевая архитектура). - Пример компиляции для Windows из Linux/macOS:
GOOS=windows GOARCH=amd64 go build -o myapp.exe
- Пример для Linux на ARM64:
GOOS=linux GOARCH=arm64 go build -o myapp
- Инструментарий Go позволяет компилировать проект для другой операционной системы и архитектуры процессора прямо из вашей рабочей среды. Это делается с помощью переменных окружения
-
Статическая линковка
- По умолчанию компилятор Go создает статически скомпонованный исполняемый файл. Это означает, что все необходимые библиотеки, включая рантайм Go, встраиваются прямо в бинарный файл.
- В результате получается один файл, который не имеет внешних зависимостей (кроме системных библиотек ОС, если используется Cgo). Его легко копировать и запускать на любой машине с целевой ОС и архитектурой.
-
Абстракция в стандартной библиотеке
- Стандартная библиотека Go (
os
,net
,io
и др.) предоставляет единый, унифицированный API для работы с системными ресурсами. - Внутри этих пакетов находится платформо-зависимый код, который реализует этот API с помощью системных вызовов конкретной ОС. Программисту не нужно об этом думать.
- Стандартная библиотека Go (
-
Условная компиляция (Build Tags)
- Go позволяет включать или исключать файлы из компиляции на основе специальных комментариев в начале файла, называемых "build tags".
-
Это позволяет писать специфичный для платформы код в отдельных файлах.
// +build linux,amd64 package mypackage // Этот файл будет скомпилирован только для Linux/amd64
Пример кода:
Этот код будет работать одинаково на любой платформе, выводя информацию о ней.
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("OS: %s, Architecture: %sn", runtime.GOOS, runtime.GOARCH)
}