Go: Установка и запуск программы на Linux

Язык программирования Go в последнее время достаточно широко используется, а поскольку файлы установки есть для всех популярных платформ, то поставлю его на Линукс (на этот раз Kali-Linux). В качестве инструкции использую мануал с этого сайта.

Шаги установки

1. Переходим в домашнюю директорию:

cd ~

2. Скачиваем архив (ссылку на последнюю стабильную версию берём со страницы загрузок):

curl -OL https://golang.org/dl/go1.20.4.linux-amd64.tar.gz

3. Проверяем контрольную сумму:

sha256sum go1.20.4.linux-amd64.tar.gz
698ef3243972a51ddb4028e4a1ac63dc6d60821bf18e59a807e051fee0a385bd  go1.20.4.linux-amd64.tar.gz

4. На всякий случай удаляем предыдущую установку:

sudo rm -rf /usr/local/go

5. Распаковываем архив в /usr/local:

sudo tar -C /usr/local -xvf go1.20.4.linux-amd64.tar.gz

6. Добавим /usr/local/go/bin в переменную пути:

~/.profile
export PATH=$PATH:/usr/local/go/bin

7. Применим изменения:

. ~/.profile

8. Проверим исполнение команд GO:

go version
go version go1.20.4 linux/amd64

Программа Hello, World!

9. Для программы мы создадим отдельную папку/директорию:

mkdir Hello

10. Перейдём в эту папку:

cd Hello

11. Создадим первую программу (тут подойдёт любой привычный вам редактор):

nano hello1.go
~/Hello/hello1.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
Выйдем из этого редактора, сохранив файл CTRL+X , Y , ENTER

 

*. Запустим нашу программу:

go run .
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
Я специально оставил этот шаг, чтобы показать ошибку. Перед эти шагом нужно создать файл go.mod, для описания зависимостей. Поэтому этот шаг с запуском мы выполним позже.

 

9. Создадим файл go.mod с описанием свойств модуля и его зависимостей:

go mod init Hello/hello1
go: creating new go.mod: module Hello/hello1
go: to add module requirements and sums:
        go mod tidy
Здесь мы указывали в качестве префикса имя нашей папки, а в качестве описания использовали имя нашего модуля.

 

10. Если теперь запустить наш код, ошибки не будет:

go run .
Hello, World!

Подключим внешний модуль

11. Зайдём на сайт с библиотекой модулей
12. В строку поиска введём слово «цитата»:

quote

13. В списке среди прочих будет выведен модуль quote (rsc.io/quote/v4)
14. Для данного примера выберем самую первую версию:
Choose module version
15. В открывшемся окне можно скопировать название библиотеки, после чего вставить в код:
Название библиотеки

Для этой программы я создам новую папку и в ней новый файл:

mkdir ~/Hello2
cd ~/Hello2
nano hello2.go

 

16. Новый файл с программой будет таким:

~/Hello2/hello2.go
package main

import "fmt"

import "rsc.io/quote"

func main() {
    fmt.Println(quote.Go())
}

17. Для нового файла создадим новый файл зависимостей:

go mod init Hello2/hello2

18. Обновим файл зависимостей:

go mod tidy
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c

19. Теперь можно запустить наш код на исполнение:

go run .
Don't communicate by sharing memory, share memory by communicating.

Ещё один способ запустить файл:

go run ~/Hello/hello1.go
Don't communicate by sharing memory, share memory by communicating.

Компиляция и установка приложения

До сих пор мы запускали наш код через интерпретатор, но мы можем скомпилировать его и «установить», чтобы можно было его запускать из любой папки/директории.

 

20. Скомпилируем файл (команду нужно запускать из той же папки, что и файл hello.go):

go build

После компиляции, в папке появился исполняемый файл hello2:

la -la
total 2064
drwxr-xr-x  2 denis denis    4096 Jun  3 13:53 .
drwx------ 27 denis denis    4096 Jun  3 13:44 ..
-rw-r--r--  1 denis denis     173 Jun  3 13:48 go.mod
-rw-r--r--  1 denis denis     499 Jun  3 13:48 go.sum
-rwxr-xr-x  1 denis denis 2092850 Jun  3 13:53 hello2
-rw-r--r--  1 denis denis      95 Jun  3 13:45 hello2.go

21. Запустим этот файл:

./hello2
Don't communicate by sharing memory, share memory by communicating.
Мы получили вывод на экран, значит успешно преобразовали наш код в исполняемый файл. Однако файл можно запускать только из этой папки. Если бы мы хотели его запустить из другой папки, то нам бы пришлось указывать полный путь, включая все вложенные папки. Если есть необходимость, можно добавить этот путь в переменную пути PATH.

 

22. Мы всё ещё находимся в папке Hello2, выполним команду:

go list -f '{{.Target}}'
/home/denis/go/bin/hello2

23. Последнее слово hello2 — это наш исполняемый файл, нам нужен путь без него, добавляем его в файл .profile:

~/.profile
export PATH=$PATH:/home/denis/go/bin/
Повторюсь — путь должен быть БЕЗ названия файла!

 

24. Применим обновлённые данные:

. ~/.profile

25. После обновления профайла мы можем запустить установку:

go install

26. Теперь можно вызывать файл из любой папки, просто указав его имя:

hello2
Don't communicate by sharing memory, share memory by communicating.
Аналогичным образом можно установить нашу первую программу hello1.go, предварительно сменив папку на Hello.

 

Компиляция под другую ОС

Вывести список поддерживаемых платформ:

go tool dist list | column -c 75 | column -t
aix/ppc64        freebsd/riscv64  linux/mips64le  openbsd/arm
android/386      illumos/amd64    linux/mipsle    openbsd/arm64
android/amd64    ios/amd64        linux/ppc64     openbsd/mips64
android/arm      ios/arm64        linux/ppc64le   plan9/386
android/arm64    js/wasm          linux/riscv64   plan9/amd64
darwin/amd64     linux/386        linux/s390x     plan9/arm
darwin/arm64     linux/amd64      netbsd/386      solaris/amd64
dragonfly/amd64  linux/arm        netbsd/amd64    windows/386
freebsd/386      linux/arm64      netbsd/arm      windows/amd64
freebsd/amd64    linux/loong64    netbsd/arm64    windows/arm
freebsd/arm      linux/mips       openbsd/386     windows/arm64
freebsd/arm64    linux/mips64     openbsd/amd64

Мы работаем под Linux, но можно наш файл скомпилировать под Windows (GOOS=windows):

GOOS=windows go build

Если полученный экзешник проверить командой file, получим такой результат:

file hello.exe
hello.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows, 13 sections
Для компиляции под роутер Sercomm RV6699 (MGTS) подойдут такие опции:

GOOS=linux GOARCH=mips GOMIPS=softfloat go build -o hello2mips
file hello2mips
hello2mips: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked,
Go BuildID=CMQC1F6Oiaohxd0-CT-V/fdE2mODk2uu_DTksfmcY/gWxdqa8sPC3l9reRvIe_/XXTsOT4j2dB3iIZgDe4A,
with debug_info, not stripped
du -b  hello2mips
2281222 hello2mips

Можно собрать исполняемый файл без отладочной информации:

GOOS=linux GOARCH=mips GOMIPS=softfloat go build -ldflags "-s -w" -o hello2mips

В этом случае его размер будет меньше, и будет отметка stripped:

file hello2mips
hello2mips: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked,
Go BuildID=FRKcpG7kEflRNdM0wfbv/us2KeK2pul6TNf4zaORe/gWxdqa8sPC3l9reRvIe_/oj7y98GkgrmMSilaTgDx,
stripped
du -b  hello2mips
1638400 hello2mips

 

Ошибки

Запустив свою программу на роутере, я получил ошибку:

./hello2mips
./hello2mips: line 1: syntax error: unexpected "("

Проблема в таком понятии, как Порядок байтов.
Я не могу на данном роутере использовать команду для определения byte order:

lscpu | grep "Byte Order"
-sh: lscpu: not found

Поэтому мне пришлось просто изменить ключи компиляции (GOARCH=mipsle), в надежде, что архитектура MIPS Little Endian:

GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -o hello2mipsle


Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments