Быстрый старт с Go: первые шаги

От установки компилятора до первой игры
5 минут27141

Go (также Golang) – компилируемый язык программирования, разработанный в компании Google и официально представленный в 2009 году. Он предназначен для создания высокоэффективных программ, рассчитанных на многоядерные и многопроцессорные компьютеры.

В этой статье мы рассмотрим азы Go, делая простые последовательные шаги:

  • скачаем и установим компилятор;
  • научимся писать несложный код, компилировать и запускать его;
  • познакомимся с переменными;
  • узнаем об условиях и циклах;
  • освоим импорт и использование функций из пакетов;
  • напишем игру «Угадай число».

Устанавливаем компилятор

Сначала посетим официальный сайт golang.org, чтобы скачать и инсталлировать компилятор Go. После этого в командной строке (терминале) станет доступна команда go. Вот пример диалога в командной строке Windows – здесь используется параметр version, который показывает версию установленного компилятора:

C:\Users\user>go version
go version go1.13 windows/amd64

Пишем «Hello, World!»

Писать исходный код можно в любом текстовом редакторе. А компиляцию и запуск проводить в командной строке (терминале).

Разумеется, лучше использовать редактор с подсветкой синтаксиса и плагином, автоматизирующим компиляцию и запуск. Для Windows подойдёт Notepad++ с плагином NppExec. Для Linux и Мас – Geany или Atom. Подробно об их настройке можно прочитать в статье «Пишем код на Java и Go в текстовом редакторе».

Писать при изучении нового языка код, который выводит «Hello, world!», – давняя традиция. Она появилась в 1978 году с выходом книги «Язык программирования С» Брайана Кернигана и Денниса Ричи. Идея такой программы – создать минимальный по объёму работающий код.

package main

func main() {
    println("Hello, World!")
}

Код начинается с ключевого слова package – объявления имени пакета. Для исполняемых файлов это всегда будет main, а для библиотек – имя директории, в которой находится файл. Функция main() – стартовая, своего рода точка входа в приложение. Она содержит вызов встроенной функции println(), которая выводит в консоль текст в скобках, заключённый в кавычки.

Набранный в редакторе код сохраняем в файле с именем hello.go. Теперь можно перейти в командную строку и запустить нашу программу для исполнения. Обратите внимание – нужно перейти в каталог, где мы сохранили файл. Вызываем go, указывая параметр run и имя файла через пробелы.

C:\Users\User>go run hello.go
Hello, world!

Знакомимся с переменными

В программировании традиционно разделяют код и данные.

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

Для хранения данных используются переменные. Их можно представить образно – как коробки с данными, на каждой из которых написаны имя и тип переменной. Нам доступны:

  • запись значения в переменную (или присвоение значения) – замена содержимого коробки;
  • чтение значения из переменной – изъятие этого содержимого.

В Go любую переменную перед использованием необходимо объявить, то есть подготовить соответствующую коробку, указав тип и имя. Это связано с тем, что Go – язык со строгой и статической типизацией. Попытка использовать переменную без предварительного объявления приведёт к ошибке компиляции.

package main

func main() {
	var x string = "Hello, world!"
	println(x)
}

В этом примере для вывода приветствия используется строчная переменная. Она объявляется при помощи ключевого слова var, после имени указывается тип string. Знак равенства означает присваивание, запись значения в переменную.

Допустима сокращённая запись, без указания типа и слова var. В этом случае перед знаком равенства ставится двоеточие (получается := вместо =). И компилятор определяет тип по значению, которое присваивается.

Правильное именование переменных – важная часть разработки. Имена должны начинаться с буквы и могут содержать буквы, цифры и знак _ (подчёркивание). Имя должно быть мнемоническим – то есть «говорящим», объясняющим назначение переменной.

package main

func main() {
	hello := "Hello, world!"
	println(hello)
}

Узнаём про условия и циклы

В программировании часто требуется выполнять одну или другую группу команд в зависимости от результата проверки (ветвление). Такую возможность предоставляет оператор if.

package main

func main() {
    water := 0
    println("Take a kettle")
    if water == 0 {
        println("Pour water into the kettle")
    } else {
        println("Enough water")
    }
    println("Put the kettle on fire")
}

Эта программа иллюстрирует ветвление, моделируя ситуацию с чайником. После ключевого слова if идёт логическое выражение (water == 0), где значение переменной water сравнивается с нулём на равенство. Если water равна нулю (в чайнике нет воды), то результат выражения будет true (истина). И, согласно заданному условию, будет выполнен блок команд в фигурных скобках после логического выражения. В противном случае – если результат выражения false – выполнится блок после else.

Помимо ветвлений в программировании используются циклы, позволяющие повторять группы (блоки) команд. Работу с циклами в Go обеспечивает оператор for. Его базовая форма содержит три фрагмента (инициализация, условие, приращение). Первый и последний фрагменты могут отсутствовать. Пустой for создаёт бесконечный цикл.

Ниже приводим код, который иллюстрирует классический for, с использованием счётчика i. Результатом его работы будет колонка чисел от 0 до 4 – значения счётчика цикла на каждой итерации (повторе).

package main

func main() {
    for i := 0; i < 5; i++ {
        println(i)
    }
}

Импортируем пакеты

Один из важных принципов программирования – DRY: Don’t Repeat Yourself (не повторяйся). Это значит, что нам не нужно писать все модули своей программы с нуля. Вместо этого можно использовать уже готовые блоки или фрагменты, написанные кем-то ранее.

Поэтому Go поставляется с богатой библиотекой, которая содержит множество пакетов (packages). Каждый пакет имеет определённую тематику, на которую указывает его имя, и содержит соответствующие функции. Подробную документацию с описанием всех пакетов и функций можно найти на сайте Go в разделе “Packages”.

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

package main

import "fmt"

func main() {
    fmt.Println("Hello,", "world!")
}

Создаём игру «Угадай число»

Наших знаний Go уже достаточно, чтобы написать игру «Угадай число». В ней компьютер загадывает целое число от 0 до 9, а человек должен отгадать его с трёх попыток.

Нам потребуются функции из пакета fmt для ввода-вывода и функция генерации случайных чисел из пакета rand.

import "fmt"
import "math/rand" 

Объявим и инициируем три целочисленные переменные: счётчик неудачных попыток – count, ввод числа с консоли – guess, загаданное число – number.

count := 0
guess := -1
number := rand.Intn(10)

Напишем основной игровой цикл. Условие его повторения описано после слова for. Тело цикла повторяется, пока значение счётчика неудачных попыток не достигнет числа 3 и при этом “загаданное” число ещё не будет отгадано.

В теле цикла читаем число-догадку с консоли и сравниваем с загаданным. В случае несовпадения выводим подсказку (больше или меньше) и увеличиваем счётчик неудачных попыток на 1. В случае совпадения цикл прекратится.

for count < 3 && guess != number {
    fmt.Print("Guess the number (0..9): ")
    fmt.Scanln(&guess)
    if guess != number {
        if guess < number {
            fmt.Println("Your number is less")
        } else {
            fmt.Println("Your number is bigger")
        }
        count++
    }
}

Также понадобится вывести результат игры (победа или проигрыш) после завершения игрового цикла.

if guess == number {
    fmt.Println("Your WON!")
} else {
    fmt.Println("Your lose...")
}

Остаётся правильно собрать все эти фрагменты в одном файле – и можно пробовать сыграть с компьютером.

Поиграв с компьютером, мы обнаружим странное поведение генератора случайных чисел. А именно: раз за разом он генерирует одинаковую последовательность. Впрочем, это легко исправить следующей строкой кода, которую надо вставить до генерации случайного числа. Не забудьте при этом импортировать пакет time.

rand.Seed(time.Now().UnixNano())

Заключение

Если у вас всё получилось — поздравляю. Если нет и возникли вопросы — пишите, спрашивайте, не стесняйтесь. Меня можно найти в Telegram под ником @biblelamp или на сайте GeekBrains. Я желаю всем удачи и рекомендую никогда не останавливаться в изучении программирования.

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

программированиеgolang
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!