Go in a nutshell
  • Go in a nutshell
  • Введение
  • Родословная или Should I Go?
  • Hello, world!
  • Базовые типы данных
  • Go - установка, сборка
  • Алфавит и пакеты
  • Синтаксис
  • Приведение типов
  • Операторы
  • Константы
  • Управление потоком
  • Массивы, срезы, отображения
  • Именованные типы и структуры
  • Указатели и оператор new
  • Функции
  • Работа с параметрами командной строки
  • Завершение работы программы
  • Методы
Powered by GitBook
On this page
  • И так, у нас в арсенале уже имеется рвущийся в бой "хеловорлд" и самый настоящий волшебный фрактал. Приступим к сборке!
  • Вот и собрали:
  • Но билдить так билдить!
  • Скорее, смотри сюда:
  • Ура, заработало!

Was this helpful?

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

PreviousБазовые типы данныхNextАлфавит и пакеты

Last updated 5 years ago

Was this helpful?

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

Качают Go вот здесь:

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

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

  • Актуальная языка на момент написания книги - go version go1.13.1 windows/amd64

  • Для PC - совместимых машин поддерживается только x86-64 (она же AMD64) архитектура. Младшая поддерживаемая версия - Windows 7. В прочих же аспектах установка сведётся к знакомому "nextr-next-next". В случае обновления старая версия будет удалена.

  • Для Linux настоятельно порекомендую использовать "комплектные" дистрибутивы и устанавливать Go через apt, yum, zypper или что у вас там под рукой. Конечно, встав на этот путь, вы не получите у себя в системе распоследних версий Go, зато избавите себя от всех прелестей красноглазия при настройке среды окружения Go и CGO.

  • К сожалению, версионность дистрибутивных версий 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", поработаем пока что под виндой);

"Главный" файл обычно именуется main.go. Имя пакета главного файла также задаётся "package main" (см. главу "!")

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

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

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

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

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

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

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

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

Скорее, смотри сюда:

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

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

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

А именно:

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

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

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

main.exe.manifest

<?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:

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

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

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))

}

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

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

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

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

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

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

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

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

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

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

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

Раунд!

Для того, чтобы этого добиться , нам понадобится GNU`тая утилита windres (можно вытянуть из ), а также файлы (содержание приблизительное):

Файл, сочетающий в себе как бинарные так и текстовые данные

А также иконка приложения

https://golang.org/dl/
Hello, world
win-builds
main-res.syso
application.ico
Сборка проекта "Hello, world!"
Используем LD флаги
Каталог для сборки программы
Окончательный вид работы программы (Windows)
Окончательный вид работы программы (Linux)