Язык программирования 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 в переменную пути:
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
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
*. Запустим нашу программу:
go run .
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
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. Для данного примера выберем самую первую версию:
15. В открывшемся окне можно скопировать название библиотеки, после чего вставить в код:
mkdir ~/Hello2
cd ~/Hello2
nano hello2.go
16. Новый файл с программой будет таким:
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.
22. Мы всё ещё находимся в папке Hello2, выполним команду:
go list -f '{{.Target}}'
/home/denis/go/bin/hello2
23. Последнее слово hello2 — это наш исполняемый файл, нам нужен путь без него, добавляем его в файл .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.
Компиляция под другую ОС
Вывести список поддерживаемых платформ:
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
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
- WordPress: Ошибка в плагине WpDiscuz - 08.10.2024
- Windows 10: Уменьшить размер виртуальной машины WSL - 06.10.2024
- Windows 10: Событие EventID 63 в Журнале Приложений - 28.09.2024