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!")
}

Запуск кода с помощью интерпретатора:

Компиляция стандартным компилятором gc (то же, что и ):

$ go build hello.go

Компиляция с помощью gccgo (то же, что и ):

$ gccgo hello.go -o hello

Компиляция с помощью gccgo и gold-линковщика:

$ gccgo hello.go -fuse-ld=gold -o hello

$GOPATH

В языке Go поиск программ и их зависимостей (например, ), сначала выполняется в каталогах, прописанных в переменную $GOPATH, а затем - в переменной $GOROOT (путь установки go, по умолчанию ).

Значение $GOPATH по умолчанию .

Создать само рабочее пространство:

$ mkdir -p ~/go/src

каталог предназначен для хранения исходных текстов проектов. При компиляции Go также создаст каталог для исполняемых файлов и для кэша отдельных пакетов. Вы можете добавить в переменную окружения для запуска установленных Go-программ:

export PATH="$PATH:$HOME/go/bin"

Подробнее смотрите .

Совет: $GOPATH работает как $PATH и может содержать несколько записей. Это может быть полезно для отделения пакетов, скачанных через go get, от вашего кода, например GOPATH=$HOME/go:$HOME/mygo

Динамические библиотеки

Компилятор Go собирает все зависимости программы в один исполняемый файл, но начиная с версии Go 1.5 появилась возможность использовать динамические библиотеки.

Для подключения всей стандартной библиотеки языка Go нужно сначала скомпилировать её как динамическую:

# go install -buildmode=shared std

скомпилированная библиотека станет доступна по адресу:

Примечание: После каждого обновления версии языка Go данную библиотек также следует пересобрать

теперь можно скомпилировать программу test.go с поддержкой динамических библиотек:

$ go build -linkshared -o test

Если необходимо скомпилировать пакет как отдельную библиотеку, выполните:

$ go install -buildmode=shared -linkshared

после чего собранную библиотеку можно найти в папке .

Пользовательскую динамическую библиотеку в системе можно использовать если:

  • поместить её в каталог который используются системой для стандартного расположения динамических библиотек, в Арче это
  • прописать путь до библиотеки в файле , после чего обновить кеш командой
  • использовать специальную переменную среды :
$ export LD_LIBRARY_PATH="/путь/к/каталогу/с/пользовательскими/динамическими/библиотеками"

если такая переменная уже существует, то:

$ export LD_LIBRARY_PATH="/путь/к/каталогу/с/пользовательскими/динамическими/библиотеками:${LD_LIBRARY_PATH}"

Кросс-компиляция

Команда go может выполнять кросс-компиляцию для некоторых других платформ.

Если для вашей сборки не нужен cgo, то просто укажите целевую ОС и архитектуру в переменных окружения для :

$ GOOS=linux GOARCH=arm64 go build .

Смотрите официальную документацию по допустимым комбинациям и $GOARCH.

Если cgo нужен, вам придётся указать путь к кросс-компиляторам в переменных окружения .

Для примера предположим, что вам нужна кросс-компиляция в и $GOARCH=arm64.

Тогда сперва установите кросс-компилятор .

Простая программа, требующая , которая позволит нам протестировать процесс кросс-компиляции:

$ 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

Можно убедиться, что архитектура созданного бинарника действительно :

$ 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

Если вы скопируете на подходящее устройство, вы сможете запустить его:

[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, вероятно, вы используете не тот пакет. Удалите и установите go. Если $GOPATH прописан, IDE должна найти ваш Go SDK в .

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

gollark: I use plutonium to heat up my toaster, it saves so much electricity and only occasionally sets fire to toast.
gollark: Then you might get banned by Discord itself.
gollark: Technically, you can, if you annoy enough people that you're banned.
gollark: Apparently pyrobot got "defestivized" recently too.
gollark: I may need to replace my phone at some point soon because the battery is degraded horribly and it's not replaceable, and it looks like basically all newish phones, even cheap ones, have trendy but impractical things like non-rectangular screens, non-replaceable batteries, metal cases, and that sort of annoying thing.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.