> For the complete documentation index, see [llms.txt](https://docs.golang.org.ua/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.golang.org.ua/go-ustanovka-sborka.md).

# Go - установка, сборка

Поверите ли,  нет ничего проще установки  компонентов Go на ваш компьютер (не считая, разве что, .NET Framework 4.6, который и так является неотъемлемой частью Windows 10 (если вы,  конечно, пользуетесь Win PC).

Качают Go вот здесь: <https://golang.org/dl/>

Не утрудим себя изучением архивных версий и угрожающего сонмища тарболлов для них, в сразу обратим внимание на раздел "Featured downloads", где нам предлагают MSI-ник для Windows. стандартный pkg файл для OS X, тёплый ламповый tarboll для Linux и, конечно, сырцы для установки на малоюзабельные оси и прочих гиков и импровизаторов. Что до деталей,  то там, как говорится, всё написано. Ищущий да обрящет.&#x20;

Впрочем, позволю себе сделать ряд заметок:

* Актуальная языка на момент написания книги - go version go1.13.1 windows/amd64
* Для PC - совместимых машин  поддерживается только x86-64 (она же AMD64) архитектура. Младшая поддерживаемая  версия - Windows 7. В прочих же аспектах установка сведётся к знакомому "nextr-next-next". В случае обновления старая версия будет удалена.
* Для Linux настоятельно порекомендую использовать "комплектные" дистрибутивы и устанавливать Go через apt, yum, zypper или что у вас там под рукой. Конечно, встав на этот путь, вы не получите у себя в системе распоследних версий Go, зато избавите себя от всех прелестей красноглазия при настройке среды окружения Go и CGO.&#x20;
* К сожалению, версионность дистрибутивных версий Go в OS Linux чаще всего отстаёт от актуальной ветки. К примеру, в ОС Ubuntu 18.04.3 LTS дистрибутивная версия Go = go version go1.10.4 linux/amd64. Однако автоар всячески не рекомендует собирать среду разработки из исходников, кроме тех случаев, когда вы точно знаете что и для чего вы делаете. В практике автора, при кроссплатформенном компилировании, ни разу не возникало проблем с различием версионности, что наводит на мысль, что такие коллизии являются достаточно редкими на практике явлениями. Однако, используя языковые новинки, нельзя забывать об осторожности.
* Не смотря на ориентацию на новейшую платформу x86-64, данный факт не означает запрета на сборку 32 -битных приложений, а также выполнения их на системах более младших версий, чем те, на которые может быть установлен сам компилятор. Так, мы вполне можем собрать 32-битный PE файл для Windows XP.
* Go для OS X - вообще золотое дно, отдых души, песнь песен... Ибо нормальных сишных компиляторов погрузить забыли, и оно вроде как и Uniх, а смейкать что-нибудь увольте-с. К счастью,  Go решает данную задачу, по крайней мере частично.

### И так, у нас в арсенале уже имеется рвущийся в бой "хеловорлд" и самый настоящий волшебный фрактал. Приступим к сборке!

Собрать что либо в Go не просто, а очень просто. Если вы "would be so kind", поработаем пока что под виндой);&#x20;

"Главный" файл обычно именуется main.go. Имя пакета главного файла также задаётся "package main"  (см. главу "[Hello, world](https://app.gitbook.com/@adm-sidorov/s/workspace/~/edit/drafts/-Lq0NIgyP1YDSPKJOiJ3/hello-world)!")

**go run main.go** - только выполнить, не собирать.

**go build main.go** - собираем, не выполняем. Имя полученного файла будет main.exe

Для смены архитектуры пишем **set goarch=386** и вуаля, мы имеем 32bit PE экзешник.

**export GOARCH=386**, соответственно, если мы в \*nix системе.

### Вот и собрали:

![Сборка проекта "Hello, world!"](/files/-Lq0gnyWZlqBbgxnZ_oI)

Однако наш файлик вышел весом как-то тяжеловат... И это для хеллоу-то ворлда! Тут и мир не перевернёшь, даже если точку точку опоры дадут. И здесь я снова рискую и забегаю вперёд. Не заведено в учебной и справочной литературе сразу нагружать читателя. Читатель - он существо нежное, а учебник штука нудная. Чтение для развлечения  - это отдых для ума и тела, а учебники читать - это труд, причём вовсе неоплачиваемый. Здесь главное читателя не спугнуть!

### Но билдить так билдить!

Сейчас открою вам одну большую тайну. Тольлко т-ссс, никому! Go в ранних версиях вовсе не разрабатывался под Windows (как, впрочем, и С), и посему ветка Windows какое-то время была "догоняющей". Зато в неё перешло множество сишных инструментов, к примеру LD флаги.

### Скорее, смотри сюда:&#x20;

**go build -ldflags "-s -w" main.go**

Вуаля, наш файлик похудел!&#x20;

![Используем LD флаги ](/files/-Lq0puf-ruPQal5HABdb)

Что мы сделали? Мы избавились от дебаговой информации.

&#x20;**А именно:**

Omit the symbol table and debug information; Omit the DWARF symbol table

Что сие такое и для чего нужно - просторы Википедии вам в помощь. От себя лишь отмечу, что использование данных флагов позволяет не только изрядно уменьшить размеры вашего продукта, но и сокрыть от чужих глаз часть информации о его внутренней структуре как бинарного файла.

Если вы думаете что "это всё", то вы очень и очень ошибётесь. У меня есть ещё пару тузов в рукаве. Файл должен быть какой? Правильно, верно оформленным. То есть (здравствуй, С) , он должен иметь ресурсы.То бишь нейм, номер билда, и иконку (можно даже красивую, я не буду против).

Для того, чтобы этого добиться , нам понадобится GNU\`тая утилита windres (можно вытянуть из [win-builds](http://mingw-w64.org/doku.php/download/win-builds)), а также файлы (содержание приблизительное):

&#x20;**main.exe.manifest**&#x20;

```markup
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="2.0.0.0"
    processorArchitecture="x86"
    name="helllo-world"
    type="win32"
/>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="1980b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

```

**main.rc:**

```
100 ICON    "applicaton.ico"
100 24      "main.exe.manifest"
```

**main-res.syso:**

Файл, сочетающий в себе как бинарные так и текстовые данные[ main-res.syso](http://aviatour.dp.ua/book/application.ico)

А также  иконка приложения [application.ico](http://aviatour.dp.ua/book/application.ico)

Формат **\*.ICO**  почти аналогичен формату **CUR** (Windows cursors), предназначенному для хранения курсоров. Создание подобных изображений не составит для вас никакой трудности, ибо для этого существует огромное количество программ и бесплатных онлайн сервисов.

И ещё. Скорее всего вы захотите неким образом именовать ваши билды и вести версионность. Да не просто абы как, а автоматически. Я готов это сделать для вас! Непринуждённым движением руки меняем текст программы:

```go
package main // Язык Go состоит из пакетов, нет динамической линковки

import ("fmt"; "strings") // "built-in" пакет fmt - сокращение от "формат"

var buildVer string = "undefined"

func main(){ // точка входа в программу

	// ещё одна вавриация на тему Printf =)
	fmt.Printf("\nHello, world! Build: %s\n", strings.Replace(buildVer, ".", "", 3))

}
```

Содержимое каталога построения программы(с учётом приобретённых знаний):

![Каталог для сборки программы](/files/-Lq1UsvMY6EaZSI2PGfd)

Остаётся только подытожить всё сказанное командой сборки ПО:

### Ура, заработало!

**windres -o main-res.syso main.rc && go build -ldflags "-s -w -X main.buildVer=%DATE%" -i**

&#x20; В итоге мы получаем готовую программу с ресурсами, значком и версией сборки. Вот результат работы данного ПО:

![Окончательный вид работы программы (Windows)](/files/-Lq1WJkzjZWry8I1WW5S)

Разумеется, подобное обогащение файла ресурсами касается только Windows. Если вы собираете для другой платформы, данные манипуляции излишни. Версионность же при сборке можно указывать всегда. Потребуется лишь немного адаптировать команду сборки ПО к используемой при сборке ОС. Для Linux, к примеру, это может выглядеть так:

**go build -ldflags '-s -w -X main.buildVer='$(date '+%d%m%Y')**&#x20;

Результат выполнения под Linux:

![Окончательный вид работы программы (Linux)](/files/-Ly9OwdNEitxC8q0CdoU)

Вообще, если вы планируете собирать для Windows из-под Linux или OsX, и хотите использовать при этом ресурсы, вам нужно будет тщательно проработать этот вопрос.

Как мог бы для себя отметить любознательный читатель, рассказ даже о таких базовых вещах, о которых мы до сей поры вели беседу,  долог и таит много нового и и интересного.

Что же, я надеюсь, что теперь уж тема "хелоуворлда" действительно раскрыта.&#x20;

#### Раунд!

&#x20;
