Go (Русский)
Цитата из официальной документации по 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 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
теперь можно скомпилировать программу 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
.