Go - установка, сборка
Поверите ли, нет ничего проще установки компонентов Go на ваш компьютер (не считая, разве что, .NET Framework 4.6, который и так является неотъемлемой частью Windows 10 (если вы, конечно, пользуетесь Win PC).
Качают Go вот здесь: https://golang.org/dl/
Не утрудим себя изучением архивных версий и угрожающего сонмища тарболлов для них, в сразу обратим внимание на раздел "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" (см. главу "Hello, world!")
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
Что сие такое и для чего нужно - просторы Википедии вам в помощь. От себя лишь отмечу, что использование данных флагов позволяет не только изрядно уменьшить размеры вашего продукта, но и сокрыть от чужих глаз часть информации о его внутренней структуре как бинарного файла.
Если вы думаете что "это всё", то вы очень и очень ошибётесь. У меня есть ещё пару тузов в рукаве. Файл должен быть какой? Правильно, верно оформленным. То есть (здравствуй, С) , он должен иметь ресурсы.То бишь нейм, номер билда, и иконку (можно даже красивую, я не буду против).
Для того, чтобы этого добиться , нам понадобится GNU`тая утилита windres (можно вытянуть из win-builds), а также файлы (содержание приблизительное):
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:
Файл, сочетающий в себе как бинарные так и текстовые данные main-res.syso
А также иконка приложения application.ico
Формат *.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, и хотите использовать при этом ресурсы, вам нужно будет тщательно проработать этот вопрос.
Как мог бы для себя отметить любознательный читатель, рассказ даже о таких базовых вещах, о которых мы до сей поры вели беседу, долог и таит много нового и и интересного.
Что же, я надеюсь, что теперь уж тема "хелоуворлда" действительно раскрыта.
Раунд!
Last updated
Was this helpful?