Go (Русский)

From ArchWiki
Jump to navigation Jump to search
Состояние перевода: На этой странице представлен перевод статьи 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.

Смотрите также