1 added
1 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>2 дек 2022</li>
2
<ul><li>2 дек 2022</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>В 2009 году в Google создали новый язык программирования. Разбираемся, почему без этого было не обойтись и за что программисты любят Go.</p>
4
</ul><p>В 2009 году в Google создали новый язык программирования. Разбираемся, почему без этого было не обойтись и за что программисты любят Go.</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
5
<p>Иллюстрация: Катя Павловская для Skillbox Media</p>
6
<p>Фанат Free Software Foundation, использует Linux и недолюбливает Windows. Пишет истории про кодинг и программы на Python. Влюблён в Lisp, но пока что не умеет на нём программировать.</p>
6
<p>Фанат Free Software Foundation, использует Linux и недолюбливает Windows. Пишет истории про кодинг и программы на Python. Влюблён в Lisp, но пока что не умеет на нём программировать.</p>
7
<p>Однажды в Google решили создать удобную и мощную альтернативу C++. Так появился Golang, который стабильно занимает высокие позиции в рейтингах языков программирования и привлекает новых разработчиков.</p>
7
<p>Однажды в Google решили создать удобную и мощную альтернативу C++. Так появился Golang, который стабильно занимает высокие позиции в рейтингах языков программирования и привлекает новых разработчиков.</p>
8
<p>Язык создали Роб Пайк и Кен Томпсон. Оба - культовые личности в computer science и в прошлом сотрудники легендарной Bell Labs. А Томпсон к тому же один из создателей ОС UNIX и языка B (предшественника C).</p>
8
<p>Язык создали Роб Пайк и Кен Томпсон. Оба - культовые личности в computer science и в прошлом сотрудники легендарной Bell Labs. А Томпсон к тому же один из создателей ОС UNIX и языка B (предшественника C).</p>
9
<p>Из этой статьи вы узнаете:</p>
9
<p>Из этой статьи вы узнаете:</p>
10
<ul><li><a>Что такое язык программирования Go</a></li>
10
<ul><li><a>Что такое язык программирования Go</a></li>
11
<li><a>Какие у него есть особенности</a></li>
11
<li><a>Какие у него есть особенности</a></li>
12
<li><a>Технические возможности языка</a></li>
12
<li><a>Технические возможности языка</a></li>
13
</ul><ul><li><a>Горутины</a></li>
13
</ul><ul><li><a>Горутины</a></li>
14
<li><a>Каналы</a></li>
14
<li><a>Каналы</a></li>
15
</ul><ul><li><a>Какие есть типы данных в Go</a></li>
15
</ul><ul><li><a>Какие есть типы данных в Go</a></li>
16
<li><a>Как установить язык и написать первую программу</a></li>
16
<li><a>Как установить язык и написать первую программу</a></li>
17
</ul><p>Go, или Golang, - это компилируемый многопоточный язык с открытым исходным кодом. В основном его применяют в веб-сервисах и клиент-серверных приложениях. В конце 2021 года Golang даже<a>вошёл</a>в топ-5 востребованных языков и опередил PHP, C# и TypeScript.</p>
17
</ul><p>Go, или Golang, - это компилируемый многопоточный язык с открытым исходным кодом. В основном его применяют в веб-сервисах и клиент-серверных приложениях. В конце 2021 года Golang даже<a>вошёл</a>в топ-5 востребованных языков и опередил PHP, C# и TypeScript.</p>
18
<p>Авторы языка попытались объединить лёгкость разработки на Python и скорость исполнения программ на C и C++, поэтому сделали Go компилируемым. И хотя в экосистеме Go есть свой интерпретатор, он редко бывает нужен. Код и так шустро компилируется.</p>
18
<p>Авторы языка попытались объединить лёгкость разработки на Python и скорость исполнения программ на C и C++, поэтому сделали Go компилируемым. И хотя в экосистеме Go есть свой интерпретатор, он редко бывает нужен. Код и так шустро компилируется.</p>
19
<p>В целом на Go можно писать что угодно: от консольных приложений до сложных многопоточных программ. Но больше всего он подходит именно для серверных приложений. При этом у языка даже существуют библиотеки для создания графических интерфейсов - хотя писать на них очень громоздко.</p>
19
<p>В целом на Go можно писать что угодно: от консольных приложений до сложных многопоточных программ. Но больше всего он подходит именно для серверных приложений. При этом у языка даже существуют библиотеки для создания графических интерфейсов - хотя писать на них очень громоздко.</p>
20
<p>Вы читаете эту статью, потому что задумываетесь о том, чтобы изучить Go-разработку? Присмотритесь к <a>этому курсу Skillbox</a> - он подойдёт вам, если вы хотите стартовать в этом направлении с нуля.</p>
20
<p>Вы читаете эту статью, потому что задумываетесь о том, чтобы изучить Go-разработку? Присмотритесь к <a>этому курсу Skillbox</a> - он подойдёт вам, если вы хотите стартовать в этом направлении с нуля.</p>
21
<p>Язык сделан так, чтобы разработчики занимались архитектурой приложений, а не тратили время на нудные вещи - например, создавали документацию или отслеживали устаревшие синтаксические конструкции. Go прост в использовании и хорош именно тем, что выполнение всех рутинных операций перенесли с программиста на встроенные инструменты.</p>
21
<p>Язык сделан так, чтобы разработчики занимались архитектурой приложений, а не тратили время на нудные вещи - например, создавали документацию или отслеживали устаревшие синтаксические конструкции. Go прост в использовании и хорош именно тем, что выполнение всех рутинных операций перенесли с программиста на встроенные инструменты.</p>
22
<p>Основными фишками Go стали:</p>
22
<p>Основными фишками Go стали:</p>
23
<ul><li><strong>Автоматическое управление памятью и сборщик мусора.</strong>Go - быстрый, как C/C++, но программировать на нём легче. Если в C/ C++ приходится вручную управлять памятью, то компилятор Golang берёт эти заботы на себя.</li>
23
<ul><li><strong>Автоматическое управление памятью и сборщик мусора.</strong>Go - быстрый, как C/C++, но программировать на нём легче. Если в C/ C++ приходится вручную управлять памятью, то компилятор Golang берёт эти заботы на себя.</li>
24
<li><strong>Синтаксический сахар.</strong>Это синтаксические послабления, которые позволяют писать код быстрее. Например, формально некоторые операции в Go (if, for) должны заканчиваться точкой с запятой, но на деле компилятор сам способен расставить точки с запятыми в нужных местах.</li>
24
<li><strong>Синтаксический сахар.</strong>Это синтаксические послабления, которые позволяют писать код быстрее. Например, формально некоторые операции в Go (if, for) должны заканчиваться точкой с запятой, но на деле компилятор сам способен расставить точки с запятыми в нужных местах.</li>
25
<li><strong>Автоматическое форматирование программ.</strong>Golang сам расставляет отступы и выравнивает элементы по колонкам с помощью команды gofmt. Но важно использовать только табуляцию для отбивки строк - пробелы в начале строки gofmt не поймёт.</li>
25
<li><strong>Автоматическое форматирование программ.</strong>Golang сам расставляет отступы и выравнивает элементы по колонкам с помощью команды gofmt. Но важно использовать только табуляцию для отбивки строк - пробелы в начале строки gofmt не поймёт.</li>
26
<li><strong>Автоматическое создание документации.</strong>Команда godoc найдёт все комментарии и сделает из них мануал к программе.</li>
26
<li><strong>Автоматическое создание документации.</strong>Команда godoc найдёт все комментарии и сделает из них мануал к программе.</li>
27
<li><strong>Отслеживание устаревших конструкций.</strong>Инструмент gofix сканирует код и отмечает синтаксические конструкции, которые считаются устаревшими по современным стандартам.</li>
27
<li><strong>Отслеживание устаревших конструкций.</strong>Инструмент gofix сканирует код и отмечает синтаксические конструкции, которые считаются устаревшими по современным стандартам.</li>
28
<li><strong>Инструменты тестирования.</strong>В Go включено множество инструментов тестирования. Например, typecheck проверяет соответствие типов в коде, golint даёт рекомендации на основе официальной документации -<a>Effective Go</a>и <a>CodeReviewComments</a>, gosimple упрощает сложные синтаксические конструкции, а gas находит уязвимости в коде.</li>
28
<li><strong>Инструменты тестирования.</strong>В Go включено множество инструментов тестирования. Например, typecheck проверяет соответствие типов в коде, golint даёт рекомендации на основе официальной документации -<a>Effective Go</a>и <a>CodeReviewComments</a>, gosimple упрощает сложные синтаксические конструкции, а gas находит уязвимости в коде.</li>
29
<li><strong>Отслеживание состояния гонки.</strong>Для работы с многопоточными системами очень важно выполнять функции в правильном порядке, чтобы не перепутать данные, потому что состояние гонки - очень коварная ошибка. Она может возникать случайным образом, из-за этого локализовать её почти невозможно. Golang изначально спроектирован так, чтобы свести такие ошибки к минимуму. А если что-то и проскочит - есть дополнительные инструменты для проверки кода на состояние гонки. Чтобы включить детектор гонки, надо добавить флаг -race - на этапе компилирования, сборки, тестирования или установки пакета.</li>
29
<li><strong>Отслеживание состояния гонки.</strong>Для работы с многопоточными системами очень важно выполнять функции в правильном порядке, чтобы не перепутать данные, потому что состояние гонки - очень коварная ошибка. Она может возникать случайным образом, из-за этого локализовать её почти невозможно. Golang изначально спроектирован так, чтобы свести такие ошибки к минимуму. А если что-то и проскочит - есть дополнительные инструменты для проверки кода на состояние гонки. Чтобы включить детектор гонки, надо добавить флаг -race - на этапе компилирования, сборки, тестирования или установки пакета.</li>
30
<li><strong>Профилирование.</strong>В языке программирования Go есть пакет pprof и консольная утилита go tool pprof. Профайлер pprof исследует, какие фрагменты кода выполняются слишком долго, где программа ест много памяти или чересчур нагружает процессор. Результат его работы - текстовый отчёт, профайл. Чтобы визуализировать профайл и построить из него схему, надо установить утилиту graphviz.</li>
30
<li><strong>Профилирование.</strong>В языке программирования Go есть пакет pprof и консольная утилита go tool pprof. Профайлер pprof исследует, какие фрагменты кода выполняются слишком долго, где программа ест много памяти или чересчур нагружает процессор. Результат его работы - текстовый отчёт, профайл. Чтобы визуализировать профайл и построить из него схему, надо установить утилиту graphviz.</li>
31
</ul>Результат работы утилиты graphviz<em>Скриншот:<a>Go</a>/ Skillbox Media</em><ul><li><strong>Низкоуровневое программирование.</strong>Безусловно, язык Go не смог бы претендовать на лавры C и C++, если бы не умел непосредственно работать с памятью. Для этого в нём есть пакет unsafe.</li>
31
</ul>Результат работы утилиты graphviz<em>Скриншот:<a>Go</a>/ Skillbox Media</em><ul><li><strong>Низкоуровневое программирование.</strong>Безусловно, язык Go не смог бы претендовать на лавры C и C++, если бы не умел непосредственно работать с памятью. Для этого в нём есть пакет unsafe.</li>
32
</ul><p>Одно из важных свойств Go - многопоточность. Тут придётся немного погрузиться в историю компьютерных технологий.</p>
32
</ul><p>Одно из важных свойств Go - многопоточность. Тут придётся немного погрузиться в историю компьютерных технологий.</p>
33
<p>В 1965 году Гордон Мур, основатель Intel, сформулировал закон: каждые два года количество транзисторов на интегральной схеме будет удваиваться. Никаких научных данных или формул за ним нет - просто наблюдение. И до XXI века закон Мура работал исправно. Но примерно после Pentium 4 стало понятно: ещё немного, и процессоры будут нагреваться, как сверхновая. Тогда производители начали делать многоядерные процессоры - тактовая частота и количество транзисторов почти не менялись, а суммарное быстродействие росло.</p>
33
<p>В 1965 году Гордон Мур, основатель Intel, сформулировал закон: каждые два года количество транзисторов на интегральной схеме будет удваиваться. Никаких научных данных или формул за ним нет - просто наблюдение. И до XXI века закон Мура работал исправно. Но примерно после Pentium 4 стало понятно: ещё немного, и процессоры будут нагреваться, как сверхновая. Тогда производители начали делать многоядерные процессоры - тактовая частота и количество транзисторов почти не менялись, а суммарное быстродействие росло.</p>
34
<p>Чтобы использовать все возможности таких процессоров, программы надо сразу писать с расчётом на многоядерность. В Go для этого есть специальные сущности: горутины и каналы.</p>
34
<p>Чтобы использовать все возможности таких процессоров, программы надо сразу писать с расчётом на многоядерность. В Go для этого есть специальные сущности: горутины и каналы.</p>
35
<p>Это функции, которые могут работать параллельно, то есть программа выполняет несколько строк практически одновременно. Чтобы сделать из функции горутину, надо просто написать перед ней go.</p>
35
<p>Это функции, которые могут работать параллельно, то есть программа выполняет несколько строк практически одновременно. Чтобы сделать из функции горутину, надо просто написать перед ней go.</p>
36
<p>Вот как это выглядит:</p>
36
<p>Вот как это выглядит:</p>
37
func server(i int) { for { print(i) time.Sleep(10) } } go server(1) go server(2)<p>Результат - практически одновременный вызов, несмотря на задержку time.Sleep (10), обеих горутин. Конечно, в небольшой программе это делать практически бессмысленно, а вот при вызове множества функций - очень даже оправданно. Экономится время, и ресурсы процессора используются равномерно.</p>
37
func server(i int) { for { print(i) time.Sleep(10) } } go server(1) go server(2)<p>Результат - практически одновременный вызов, несмотря на задержку time.Sleep (10), обеих горутин. Конечно, в небольшой программе это делать практически бессмысленно, а вот при вызове множества функций - очень даже оправданно. Экономится время, и ресурсы процессора используются равномерно.</p>
38
<p>За выполнением горутин в Go следит специальная библиотека времени исполнения: она распределяет между ними ядра процессора, может ограничивать число доступных ядер. Библиотека помогает запускать огромное количество горутин - намного больше, чем позволяет операционная система, - и не требует от программиста заниматься распараллеливанием вручную.</p>
38
<p>За выполнением горутин в Go следит специальная библиотека времени исполнения: она распределяет между ними ядра процессора, может ограничивать число доступных ядер. Библиотека помогает запускать огромное количество горутин - намного больше, чем позволяет операционная система, - и не требует от программиста заниматься распараллеливанием вручную.</p>
39
<p>Это что-то вроде общего хранилища данных. Каналы передаются как аргументы горутин и помогают им общаться между собой и обмениваться данными. В каналах есть очередь и блокировка - чтобы разные горутины не смогли одновременно закинуть туда разные данные. Особенность каналов: они позволяют записывать и считывать только один тип данных. Например, int - целые числа.</p>
39
<p>Это что-то вроде общего хранилища данных. Каналы передаются как аргументы горутин и помогают им общаться между собой и обмениваться данными. В каналах есть очередь и блокировка - чтобы разные горутины не смогли одновременно закинуть туда разные данные. Особенность каналов: они позволяют записывать и считывать только один тип данных. Например, int - целые числа.</p>
40
package main import "fmt" func main() { channel := make(chan float32) fmt.Printf("type of 'c' is %T\n", channel) fmt.Printf("value of 'c' is %v\n", channel) }Запустить на <a>play.golang.org</a><p>Немного похоже на работу с переменными - используем оператор присваивания и сразу задаём тип данных. Но интересно, что значением канала будет его адрес в памяти (вывод второго оператора Printf).</p>
40
package main import "fmt" func main() { channel := make(chan float32) fmt.Printf("type of 'c' is %T\n", channel) fmt.Printf("value of 'c' is %v\n", channel) }Запустить на <a>play.golang.org</a><p>Немного похоже на работу с переменными - используем оператор присваивания и сразу задаём тип данных. Но интересно, что значением канала будет его адрес в памяти (вывод второго оператора Printf).</p>
41
<p>Теперь объединим горутины и канал:</p>
41
<p>Теперь объединим горутины и канал:</p>
42
package main import "fmt" func gorutine_test(channel chan string) { fmt.Println("Hey, " + <-channel + "!") } func main() { fmt.Println("main() started") channel := make(chan string) go gorutine_test(channel) channel <- "Rob" fmt.Println("main() stopped") }Запустить на <a>play.golang.org</a><p>А сейчас следите за руками - будем разбирать код:</p>
42
package main import "fmt" func gorutine_test(channel chan string) { fmt.Println("Hey, " + <-channel + "!") } func main() { fmt.Println("main() started") channel := make(chan string) go gorutine_test(channel) channel <- "Rob" fmt.Println("main() stopped") }Запустить на <a>play.golang.org</a><p>А сейчас следите за руками - будем разбирать код:</p>
43
<ul><li>Объявляем функцию gorutine_test с аргументом channel. Результат её работы - строка приветствия и данные из канала, мы считываем их с помощью оператора <-.</li>
43
<ul><li>Объявляем функцию gorutine_test с аргументом channel. Результат её работы - строка приветствия и данные из канала, мы считываем их с помощью оператора <-.</li>
44
<li>Функция main первым делом выводит на экран сообщение о том, что она стартовала.</li>
44
<li>Функция main первым делом выводит на экран сообщение о том, что она стартовала.</li>
45
<li>После этого мы создаём канал channel и задаём ему тип данных string.</li>
45
<li>После этого мы создаём канал channel и задаём ему тип данных string.</li>
46
<li>Теперь запускаем функцию gorutine_test как горутину и помещаем в неё канал channel.</li>
46
<li>Теперь запускаем функцию gorutine_test как горутину и помещаем в неё канал channel.</li>
47
<li>Сейчас и main, и gorutine_test активны.</li>
47
<li>Сейчас и main, и gorutine_test активны.</li>
48
<li>Теперь мы помещаем в канал имя создателя языка программирования Go - Rob. Функция main тут же блокируется, пока gorutine_test не считает данные из канала. Заметьте, gorutine_test вызывается раньше, чем мы отправляем значение в канал, но планировщик Go выполняет именно её.</li>
48
<li>Теперь мы помещаем в канал имя создателя языка программирования Go - Rob. Функция main тут же блокируется, пока gorutine_test не считает данные из канала. Заметьте, gorutine_test вызывается раньше, чем мы отправляем значение в канал, но планировщик Go выполняет именно её.</li>
49
<li>После этого функция main разблокируется и выводит сообщение о том, что она закончила работу.<p>В многопоточность отлично вписывается функциональная парадигма программирования, и язык Go во многом поддерживает её. В нём, конечно, присутствуют императивные конструкции, элементы ООП и всё такое. Но именно ярко выраженная функциональная парадигма делает Golang мощным инструментом для высоконагруженных серверных решений, сервисов и сложных вычислений.</p>
49
<li>После этого функция main разблокируется и выводит сообщение о том, что она закончила работу.<p>В многопоточность отлично вписывается функциональная парадигма программирования, и язык Go во многом поддерживает её. В нём, конечно, присутствуют императивные конструкции, элементы ООП и всё такое. Но именно ярко выраженная функциональная парадигма делает Golang мощным инструментом для высоконагруженных серверных решений, сервисов и сложных вычислений.</p>
50
</li>
50
</li>
51
</ul><p>Go - язык со строгой статической типизацией, то есть каждая переменная имеет свой тип и менять его нельзя. Сравним с PHP:</p>
51
</ul><p>Go - язык со строгой статической типизацией, то есть каждая переменная имеет свой тип и менять его нельзя. Сравним с PHP:</p>
52
<?php $foo = "1"; // $foo - это строка (ASCII-код 49) $foo *= 2; // $foo теперь целое число (2) $foo = $foo * 1.3; // $foo теперь число с плавающей точкой (2.6) $foo = 5 * "10 Little Piggies"; // $foo - это целое число (50) $foo = 5 * "10 Small Pigs"; // $foo - это целое число (50) $a = "1.5"; // $a - это строка $b = 100; // $b - это целое число $c = $a * $b; // $c - это число с плавающей точкой, значение - 150.0 ?><p>В примере мы изменили тип данных на лету и даже провели математические операции над строкой и целым числом. В языке Go это невозможно - если переменная объявлена как целое число, такой она и останется на протяжении исполнения всей программы, можно менять только её значение. А если попытаемся положить в неё данные другого типа - модуль проверки Go подскажет, что у нас ошибка.</p>
52
<?php $foo = "1"; // $foo - это строка (ASCII-код 49) $foo *= 2; // $foo теперь целое число (2) $foo = $foo * 1.3; // $foo теперь число с плавающей точкой (2.6) $foo = 5 * "10 Little Piggies"; // $foo - это целое число (50) $foo = 5 * "10 Small Pigs"; // $foo - это целое число (50) $a = "1.5"; // $a - это строка $b = 100; // $b - это целое число $c = $a * $b; // $c - это число с плавающей точкой, значение - 150.0 ?><p>В примере мы изменили тип данных на лету и даже провели математические операции над строкой и целым числом. В языке Go это невозможно - если переменная объявлена как целое число, такой она и останется на протяжении исполнения всей программы, можно менять только её значение. А если попытаемся положить в неё данные другого типа - модуль проверки Go подскажет, что у нас ошибка.</p>
53
<p>В языке программирования есть 11 типов целых чисел. Они различаются количеством бит, спецификой (например, есть отдельный тип byte для двоичных чисел) и контекстом (например, uintptr для работы с внешним кодом). Кроме того, есть числа с плавающей точкой, комплексные числа, булевы числа, строки и три типа чисел с неограниченной точностью, которые могут принимать любое значение и ограничены только объёмом памяти компьютера.</p>
53
<p>В языке программирования есть 11 типов целых чисел. Они различаются количеством бит, спецификой (например, есть отдельный тип byte для двоичных чисел) и контекстом (например, uintptr для работы с внешним кодом). Кроме того, есть числа с плавающей точкой, комплексные числа, булевы числа, строки и три типа чисел с неограниченной точностью, которые могут принимать любое значение и ограничены только объёмом памяти компьютера.</p>
54
<p>Переменные в Go объявляются в стиле Pascal - через оператор var, а само объявление можно совмещать с присваиванием:</p>
54
<p>Переменные в Go объявляются в стиле Pascal - через оператор var, а само объявление можно совмещать с присваиванием:</p>
55
var v1 int // Объявляет переменную v1 и задаёт ей тип "целое число" var v2 string = "teach Go, friend" // Объявляет переменную v2, задаёт ей тип "строка" и присваивает значение "teach Go, friend" v1 := v2 // То же, что и var v1 = v2, объявляет переменную и задаёт ей значение<ul><li>В первой строке мы объявляем переменную v1 и задаём ей тип "целое число";</li>
55
var v1 int // Объявляет переменную v1 и задаёт ей тип "целое число" var v2 string = "teach Go, friend" // Объявляет переменную v2, задаёт ей тип "строка" и присваивает значение "teach Go, friend" v1 := v2 // То же, что и var v1 = v2, объявляет переменную и задаёт ей значение<ul><li>В первой строке мы объявляем переменную v1 и задаём ей тип "целое число";</li>
56
<li>во второй строке - объявляем переменную v2, задаём ей тип "строка" и присваиваем значение teach Go, friend;</li>
56
<li>во второй строке - объявляем переменную v2, задаём ей тип "строка" и присваиваем значение teach Go, friend;</li>
57
<li>в третьей строке - делаем то же, что и v1 = v2, объявляем переменную и задаём ей значение.</li>
57
<li>в третьей строке - делаем то же, что и v1 = v2, объявляем переменную и задаём ей значение.</li>
58
</ul><p>Оператор присваивания в Go - знак =:</p>
58
</ul><p>Оператор присваивания в Go - знак =:</p>
59
a = b i, j = j, i<p>Здесь мы в первой строке присвоили переменной a значение b, а вот во второй - поменяли местами значения i и j.</p>
59
a = b i, j = j, i<p>Здесь мы в первой строке присвоили переменной a значение b, а вот во второй - поменяли местами значения i и j.</p>
60
<p>Скачать Go для разных платформ можно<a>на официальном сайте</a>: есть готовые сборки для Windows, macOS, Linux. Также исходники можно скомпилировать на куче операционок - FreeBSD, OpenBSD, DragonFly BSD, Solaris, Android, AIX, Plan 9 (кстати, тоже детище Томпсона и Пайка с названием - отсылкой к фильму<a>Эда Вуда</a>, самого знаменитого неудачника фабрики грёз).</p>
60
<p>Скачать Go для разных платформ можно<a>на официальном сайте</a>: есть готовые сборки для Windows, macOS, Linux. Также исходники можно скомпилировать на куче операционок - FreeBSD, OpenBSD, DragonFly BSD, Solaris, Android, AIX, Plan 9 (кстати, тоже детище Томпсона и Пайка с названием - отсылкой к фильму<a>Эда Вуда</a>, самого знаменитого неудачника фабрики грёз).</p>
61
<p>Чтобы проверить, успешно ли установился Go на Windows, введите команду go в командной строке.</p>
61
<p>Чтобы проверить, успешно ли установился Go на Windows, введите команду go в командной строке.</p>
62
<em>Скриншот: Skillbox Media</em><p>Писать код на Go можно в программах трёх типов - кому что больше подходит:</p>
62
<em>Скриншот: Skillbox Media</em><p>Писать код на Go можно в программах трёх типов - кому что больше подходит:</p>
63
<ul><li>Текстовый редактор с подсветкой синтаксиса Go, автодополнением, компиляцией и отладкой. Обычно реализованы плагинами - например, в Notepad++, Vim, Emacs.</li>
63
<ul><li>Текстовый редактор с подсветкой синтаксиса Go, автодополнением, компиляцией и отладкой. Обычно реализованы плагинами - например, в Notepad++, Vim, Emacs.</li>
64
<li>Универсальная среда разработки (IDE): Eclipse, NetBeans, IntelliJ IDEA, Komodo, Codebox, Visual Studio, Zeus IDE и другие.</li>
64
<li>Универсальная среда разработки (IDE): Eclipse, NetBeans, IntelliJ IDEA, Komodo, Codebox, Visual Studio, Zeus IDE и другие.</li>
65
<li>Специализированная среда разработки для Golang. Самые известные - коммерческая GoLand от JetBrains и опенсорсная LiteIDE.</li>
65
<li>Специализированная среда разработки для Golang. Самые известные - коммерческая GoLand от JetBrains и опенсорсная LiteIDE.</li>
66
</ul><p>Здесь мы напомним про курс Skillbox "<a>Профессия Go-разработчик</a>". На курсе вы с нуля научитесь создавать на Go приложения с микросервисной архитектурой.</p>
66
</ul><p>Здесь мы напомним про курс Skillbox "<a>Профессия Go-разработчик</a>". На курсе вы с нуля научитесь создавать на Go приложения с микросервисной архитектурой.</p>
67
<p>По традиции это, конечно, Hello, World!. Ниже - разбор синтаксиса:</p>
67
<p>По традиции это, конечно, Hello, World!. Ниже - разбор синтаксиса:</p>
68
package main import "fmt" func main() { fmt.Println("Hello, World!") }<ul><li>package main - даём имя пакету, так надо для файлов, которые будут исполняться;</li>
68
package main import "fmt" func main() { fmt.Println("Hello, World!") }<ul><li>package main - даём имя пакету, так надо для файлов, которые будут исполняться;</li>
69
<li>import 'fmt' - вызываем пакет, который отвечает за форматирование и вывод информации (такие пакеты ещё называются библиотеками);</li>
69
<li>import 'fmt' - вызываем пакет, который отвечает за форматирование и вывод информации (такие пакеты ещё называются библиотеками);</li>
70
<li>func main() - каждый исполняемый файл должен включать главную функцию - main;</li>
70
<li>func main() - каждый исполняемый файл должен включать главную функцию - main;</li>
71
<li>fmt.Println("Hello, World!") - вызываем функцию Println из пакета fmt, она выводит информацию из круглых скобок на экран;</li>
71
<li>fmt.Println("Hello, World!") - вызываем функцию Println из пакета fmt, она выводит информацию из круглых скобок на экран;</li>
72
<li>"Hello, World!" - кавычки показывают, что надо вывести как строку всё, что внутри;</li>
72
<li>"Hello, World!" - кавычки показывают, что надо вывести как строку всё, что внутри;</li>
73
<li>// - а вот так обозначаются однострочные комментарии, всё, что идёт после этого символа и до конца строки, компилятор Go пропускает.</li>
73
<li>// - а вот так обозначаются однострочные комментарии, всё, что идёт после этого символа и до конца строки, компилятор Go пропускает.</li>
74
</ul><p>Теперь давайте сделаем что-то посложнее. Напишем функцию, которая будет возвращать числа Фибоначчи:</p>
74
</ul><p>Теперь давайте сделаем что-то посложнее. Напишем функцию, которая будет возвращать числа Фибоначчи:</p>
75
package main import "fmt" func fib() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return a } } func main() { f := fib() fmt.Println(f(), f(), f(), f(), f()) }<ul><li>Первые две строки точно такие же, как и в прошлом примере.</li>
75
package main import "fmt" func fib() func() int { a, b := 0, 1 return func() int { a, b = b, a+b return a } } func main() { f := fib() fmt.Println(f(), f(), f(), f(), f()) }<ul><li>Первые две строки точно такие же, как и в прошлом примере.</li>
76
<li>func fib() func() int - объявляем функцию, которая будет возвращать очередное число Фибоначчи. Она называется fib и возвращает другую функцию - func () int. Это нужно, чтобы мы при каждом новом вызове получали следующее число Фибоначчи.</li>
76
<li>func fib() func() int - объявляем функцию, которая будет возвращать очередное число Фибоначчи. Она называется fib и возвращает другую функцию - func () int. Это нужно, чтобы мы при каждом новом вызове получали следующее число Фибоначчи.</li>
77
<li>a, b: = 0, 1 - создаём две переменные и присваиваем им значения 0 и 1 соответственно. Это нужно, чтобы вычислить следующее число Фибоначчи.</li>
77
<li>a, b: = 0, 1 - создаём две переменные и присваиваем им значения 0 и 1 соответственно. Это нужно, чтобы вычислить следующее число Фибоначчи.</li>
78
<li>return func() int - возвращаем функцию.</li>
78
<li>return func() int - возвращаем функцию.</li>
79
<li>a, b = b, a+b - считаем следующее число Фибоначчи.</li>
79
<li>a, b = b, a+b - считаем следующее число Фибоначчи.</li>
80
<li>return a - возвращаем очередное число Фибоначчи.</li>
80
<li>return a - возвращаем очередное число Фибоначчи.</li>
81
<li>func main - вызываем главную функцию main.</li>
81
<li>func main - вызываем главную функцию main.</li>
82
<li>f: = fib() - создаём переменную f и кладём в неё функцию, которая при каждом вызове будет возвращать следующее число Фибоначчи.</li>
82
<li>f: = fib() - создаём переменную f и кладём в неё функцию, которая при каждом вызове будет возвращать следующее число Фибоначчи.</li>
83
<li>fmt.Println (f(), f(), f(), f(), f()) - выводим первые пять чисел Фибоначчи.</li>
83
<li>fmt.Println (f(), f(), f(), f(), f()) - выводим первые пять чисел Фибоначчи.</li>
84
</ul><p>Go - мощный, изящный и современный язык программирования, по скорости сравнимый с C и C++, а по простоте создания кода - с Python. Освоить его может даже новичок. У Golang простая, лаконичная документация и дружелюбное сообщество, где всегда можно задать вопрос, - опытный программист быстро выучит его как второй язык. Перспективы вполне серьёзные, на долгое время: язык поддерживается Google, но живёт как самостоятельный свободный проект с открытыми исходниками.</p>
84
</ul><p>Go - мощный, изящный и современный язык программирования, по скорости сравнимый с C и C++, а по простоте создания кода - с Python. Освоить его может даже новичок. У Golang простая, лаконичная документация и дружелюбное сообщество, где всегда можно задать вопрос, - опытный программист быстро выучит его как второй язык. Перспективы вполне серьёзные, на долгое время: язык поддерживается Google, но живёт как самостоятельный свободный проект с открытыми исходниками.</p>
85
-
<a><b>Как быстро заработать в IT в 2025 году</b>Попробуйте себя в разных направлениях IT и сделайте первый шаг к новой профессии на удалёнке! Учиться бесплатно →</a>
85
+
<a><b>Как быстро заработать в IT в 2026 году</b>Попробуйте себя в разных направлениях IT и сделайте первый шаг к новой профессии на удалёнке! Учиться бесплатно →</a>