Go (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Go
. Дата последней синхронизации: 16 сентября 2021. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Цитата из
официальной документации по golang
Go
выразительный, лаконичный, чистый и эффективный язык. Его механизмы параллельности позволяют легко создавать программы, которые получают максимальную отдачу от многоядерных и сетевых машин, в то время как новая система типов позволяет создать гибкую и модульную программу. Go не только быстро компилирует в машинный код, но также имеет сборщик мусора и run-time рефлексию. Он быстр, статически типизирован и компилируемый язык но при этом выглядит как динамически типизированный и интерпретируемый язык.
Установка
Стандартным компилятором Go является
go
, который
устанавливается
с пакетом
go
. Команда
go
также включает в себя утилиты вроде
go get
,
go doc
и т.д.
Есть альтернативный компилятор
gcc-go
, являющийся фронтендом для
GCC
. Он обычно медленее, но лучше оптимизирует. Если не уверены, используйте
go
.
Также вместе с
go
можно установить пакет
go-tools
который включает в себя документацию(
godoc
) и дополнительные инструменты разработчика, такие как
goimports
,
guru
,
gorename
, и т.д.
Проверка установки
Вы можете проверить корректность установки, собрав простую программу:
hello.go
package main

import "fmt"

func main() {
	fmt.Println("Привет, Arch!")
}
Запуск кода с помощью интерпретатора:
$ go run hello.go
Привет, Arch!
Компиляция стандартным компилятором
gc
(то же, что и
go build -compiler=gc hello.go
):
$ go build hello.go
Компиляция с помощью
gccgo
(то же, что и
go build -compiler=gccgo hello.go
):
$ gccgo hello.go -o hello
Компиляция с помощью
gccgo
и
gold-линковщика
:
$ gccgo hello.go -fuse-ld=gold -o hello
$GOPATH
В языке Go поиск программ и их зависимостей (например,
import "
пакет
"
), сначала выполняется в каталогах, прописанных в переменную
$GOPATH
, а затем - в переменной
$GOROOT
(путь установки
go
, по умолчанию
/usr/lib/go
).
Значение
$GOPATH
по умолчанию
~/go
.
Совет
Для просмотра переменных Go используйте команду
go env
Создать само рабочее пространство:
$ mkdir -p ~/go/src
каталог
~/go/src
предназначен для хранения исходных текстов проектов. При компиляции Go также создаст каталог
bin
для исполняемых файлов и
pkg
для кэша отдельных пакетов. Вы можете добавить
~/go/bin
в
переменную окружения
$PATH
для запуска установленных Go-программ:
export PATH="$PATH:$HOME/go/bin"
Подробнее смотрите
go help gopath
.
Совет
$GOPATH
работает как
$PATH
и может содержать несколько записей. Это может быть полезно для отделения пакетов, скачанных через
go get
, от вашего кода, например
GOPATH=$HOME/go:$HOME/mygo
Динамические библиотеки
Компилятор Go собирает все зависимости программы в один исполняемый файл, но начиная с версии Go 1.5 появилась возможность использовать динамические библиотеки.
Для подключения
всей стандартной библиотеки языка Go
нужно сначала скомпилировать её как динамическую:
# go install -buildmode=shared std
скомпилированная библиотека станет доступна по адресу:
$(go env GOROOT)/pkg/$(go env GOOS)_$(go env GOARCH)_dynlink/libstd.so
Примечание
После каждого обновления версии языка Go данную библиотек также следует пересобрать
теперь можно скомпилировать программу test.go с поддержкой динамических библиотек:
$ go build -linkshared -o test
Если необходимо скомпилировать пакет как отдельную библиотеку, выполните:
$ go install -buildmode=shared -linkshared
после чего собранную библиотеку можно найти в папке
$GOPATH/pkg/$(go env GOOS)_$(go env GOARCH)_dynlink
.
Пользовательскую динамическую библиотеку в системе можно использовать если:
поместить её в каталог который используются системой для стандартного расположения динамических библиотек, в Арче это
/usr/lib/
прописать путь до библиотеки в файле
/etc/ld.so.conf
, после чего обновить кеш командой
ldconfig
использовать специальную переменную среды
$LD_LIBRARY_PATH
:
$ export LD_LIBRARY_PATH="/путь/к/каталогу/с/пользовательскими/динамическими/библиотеками"
если такая переменная уже существует, то:
$ export LD_LIBRARY_PATH="/путь/к/каталогу/с/пользовательскими/динамическими/библиотеками:${LD_LIBRARY_PATH}"
Кросс-компиляция
Команда
go
может выполнять кросс-компиляцию для
некоторых других платформ
.
Если для вашей сборки не нужен
cgo
, то просто укажите целевую ОС и архитектуру в переменных окружения для
go build
:
$ GOOS=linux GOARCH=arm64 go build .
Смотрите
официальную документацию
по допустимым комбинациям
$GOOS
и
$GOARCH
.
Если
cgo
нужен, вам придётся указать путь к кросс-компиляторам
C/C++
в переменных окружения
$CC/$CXX
.
Для примера предположим, что вам нужна кросс-компиляция в
$GOOS=linux
и
$GOARCH=arm64
.
Тогда сперва установите кросс-компилятор
aarch64-linux-gnu-gcc
.
Простая программа, требующая
cgo
, которая позволит нам протестировать процесс кросс-компиляции:
$ cat > hello.go <<EOF
package main

// #include <stdio.h>
// void hello() {  puts("Hello, Arch!"); }
import "C"

func main() { C.hello() }
EOF
Теперь можно запустить кросс-компиляцию примерно так:
$ GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=/usr/bin/aarch64-linux-gnu-gcc go build hello.go
Можно убедиться, что архитектура созданного бинарника действительно
aarch64
:
$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=b1d92ae8840a019f36cc2aee4606b6ae4a581bf1, for GNU/Linux 3.7.0, not stripped
Если вы скопируете
hello
на подходящее устройство, вы сможете запустить его:
[alarm@rpi3 ~]$ uname -a
Linux alarm 5.3.8-1-ARCH #1 SMP Tue Oct 29 19:31:23 MDT 2019 aarch64 GNU/Linux
[alarm@arpi3 ~]$ ./hello
Hello, Arch!
Оптимизация
Компилятор
go
по умолчанию собирает пакет с дополнительной информацией которая влияет только на отладку и анализ полученного файла.
Чтобы этого избежать можно использовать ключ
-ldflags
с флагами отвечающими за отключения отладочной информации (
-w
) и сгенерированной таблицей символов (
-s
):
$ go build -ldflags '-w -s' test.go
Решение проблем
Плагин Jetbrains Go
Если в Jetbrains IDE плагин Go не может найти путь к Go SDK, вероятно, вы используете не тот пакет. Удалите
gcc-go
и установите
go
. Если
$GOPATH
прописан, IDE должна найти ваш Go SDK в
/usr/lib/go
.
Смотрите также
Официальный веб-сайт языка Go (en)
Тур по Go
Статья в Википедии
Go в примерах
Awesome Go
Кросс-компиляция Go
IDE и плагины для Go
Руководство создания пакетов(AUR) для Go