Jump to content

# Go (Русский)

4 languages

- English
- Español
- 日本語
- 中文（简体）

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

Category:

- Programming languages (Русский)