🏃 Самоучитель для начинающих: как освоить Go с нуля за 30 минут?

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

Установка Go

Заходим на официальный сайт Go.

Нажимаем на Download Go.

Выбираем версию для своей операционной системы и скачиваем.

Пользователям Windows нужно запустить установщик. Если вы используете Linux, придется распаковать скачанный архив в /usr/local/go и экспортировать путь /usr/local/go/bin в переменную среды $PATH . Получиться должна примерно следующая структура папок:

Чтоб убедиться в успешной установке введите команду go version в консоли или терминале:

Установка редактора кода

Go поддерживается в различных редакторах кода (IDE), к примеру:

  • Goland
  • Visual Studio Code
  • vim

Полный список IDE доступен по сылке: https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins

Создание проекта

Создадим директорию helloworld. Перейдем в нее и выполним команду:

go mod init helloworld

Должен появиться файл с названием go.mod.

Код на Go лежит в пакетах, а пакеты группируются в модули. Модуль – это набор пакетов Go с файлом go.mod в корне. Этот файл определяет путь модуля и набор импортируемых модулей.

Далее создадим файл main.go и запишем в него следующий код:

main.go
package main

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

Компиляция и запуск программы

Чтобы запустить код, откройте консоль или терминал. Далее перейдите в каталог, где расположен файл main.go и выполните команду:

go run main.go

Результат работы программы будет следующим:

Вы написали первую программу на Go, поздравляем!

Давайте разберем, что здесь происходит:

  • Функция main – входная точка программы. С нее основная программа начинается и в ней же завершается.
  • println – функция, выводящая текст на экран консоли. Для вызова используется следующий синтаксис: название функции + открывающая круглая скобка + аргументы функции + закрывающая круглая скобка + операторные скобки {}.
  • По достижении последней фигурной скобки функции main программа завершается.

Код, листинги которого будут приведены ниже, должны располагаться внутри фигурных (операторных) скобок функции main. В примерах функция main будет опущена для краткости.

Переменные

Переменные в Go характеризуются названием и типом, они должны объявляться до первого использования.

В Go нельзя объявить переменную и не использовать ее – программа не соберется.

Объявление переменной в Go:

var number int

Мы объявили переменную number с типом int. int – тип переменной, которая хранит целое число.

Базовые типы данных:

  • bool
  • string
  • int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
  • byte // псевдоним для uint8
  • rune // псевдоним для int32
  • float32 float64
  • complex64 complex128

При объявлении переменной устанавливается ее начальное значение. Для int это 0, для float – 0.0, для string – "" (пустая строка), для boolfalse.

Если начальное значение переменной известно во время объявления, можно воспользоваться краткой записью:

number := 0
// эквивалентно
var number = 0

Чтобы записать значение в переменную после ее объявления, воспользуйтесь оператором =:

var number, secondNumber int
number = 15
secondNumber = number
println(number)       // Вывод: 15
println(secondNumber) // Вывод: 15

Над переменными можно производить операции с помощью операторов. Например, числа можно сравнить, а строки конкатенировать.

Список операторов Go:

Управляющие конструкции

Для управления тем, какие строки кода исполнятся и в каком порядке, существуют специальные конструкции. Давайте перечислим основные:

  • Следование
  • Условие
  • Циклы

Следование

Весь код исполняется последовательно, строка за строкой.

Условие

Для исполнения участка кода в зависимости от условия используется условная конструкция if:

number := 15
secondNumber := 10
if number < secondNumber {
  println("первое число меньше второго")
}

Сообщение не будет выведено на экран, так как условие ложно. На месте условия может использоваться все, результатом чего будет значение типа bool.

Чтобы определить код, который выполнится при невыполнении ни одного условия можно добавить else:

if number < secondNumber {
  println("первое число меньше второго")
} else if number > secondNumber {
  println("второе число меньше первого")
} else {
  println("числа равны")
}

Дополнительно к конструкции управления if имеется конструкция switch, работающая подобным образом:

switch 200 {
case 100:
  println("число равно 100")
case 200:
  println("число равно 200") // будет выведено это
}

switch получает значение 200 и ищет case, в котором значения совпадают и выполняет только определенный участок кода.

switch также может использоваться как замена if. Перепишем пример с if:

switch {
case number < secondNumber:
  println("первое число меньше второго")
case number > secondNumber:
  println("второе число меньше первого")
default:
  println("числа равны")
}

Роль else здесь играет слово default. Оно также будет выполнено при невыполнении ни одного из условий.

Циклы

Обратите внимание: для повторения участков кода в Go используется только цикл for, который может принимать разные формы:

for i := 1; i <= 10; i++ {
  println(i)
}

Этот цикл распечатает значения от 1 до 10.

Если нужен цикл без счетчика, нужно опустить первую и третью части цикла for вместе с точкой запятой:

for number < secondNumber {
  number = number + 1
}

На каждом повторении цикла будет проверяться заданное условие. Пока условие истинно, цикл будет продолжаться. Как только условие станет ложным, он прервется.

Для бесконечного цикла можно опустить условие:

for {
  println("Бесконечный цикл")
}

Чтобы остановить цикл, используется ключевое слово break:

i := 0
for {
  println("Бесконечный цикл")
  if i == 10 {
     break
  }
  i++
}

При достижении конструкции break цикл будет завершен.

Внутри цикла также можно использовать специально слово continue. Оно отличается от break тем, что не сразу завершает цикл, а лишь пропускает оставшийся код цикла и начинает новое повторение.

Массивы

Массив – это последовательная группа ячеек памяти, имеющих одинаковое имя и одинаковый тип. Простое определение – набор упорядоченных элементов.

Объявление массива:

var numbers [3]int

Обращение к элементам массива производится по имени массива и индексу элемента. Элементы массива индексируются с нуля.

Заполнение массива значениями:

numbers[0] = 10
numbers[1] = 11
numbers[2] = 12

Если начальное значение массива известно при объявлении, можно воспользоваться литералом объявления массива:

var numbers [3]int = [3]int{10, 11, 12}

Для избежания лишнего кода воспользуемся кратким объявлением:

numbers := [3]int{10, 11, 12}

Размер массива статичен и не может меняться во время выполнения программы. Для этих целей используются слайсы.

Слайсы

Слайс является более удобной альтернативой массиву. Объявление слайса отличается от объявления массива только отсутствием размера:

numbers := [3]int{10, 11, 12} // массив
numbers := []int{10, 11, 12} // слайс

Слайс может менять размер во время выполнения программы. Для добавления новых элементов в слайс используется встроенная функция append:

numbers = append(numbers, 13) // добавление одного элемента
numbers = append(numbers, 14, 15) // добавление двух элементов

Функции

Для переиспользования часто используемого кода нужны функции.

Функция – это названный кусок кода, который может вызываться по имени. Мы уже использовали функцию println для вывода значений на экран.

Функция должна быть объявлена вне функции main:

func НазваниеФункции(первыйАргумент int, второйАргумент int) (возвращаемоеЗначение int) {
  // тело функции
  return 0
}

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

Функция Sum складывает два числа и возвращает результат:

func Sum(a, b int) int {
  return a + b
}

Функция SumAndDivide возвращает как сумму, так и частное чисел:

func SumAndDivide(a, b int) (int, int) {
  return a + b, a / b
}

Обе функции доступны в функции main:

func main() {
  sum := Sum(1, 2)
  println(sum) // 3
  sum, division := SumAndDivide(4, 2)
  println(sum)      // 6
  println(division) // 2
}

Пакеты

Писать код большой программы в одном файле неудобно. Тем более переиспользовать этот код нельзя. Поэтому код разбивается на пакеты – наборы файлов с расширением .go и кодом, который можно импортировать и переиспользовать. Стандартная библиотека языка Go содержит много часто используемых и важных пакетов. Например, в пакете strings содержатся функции для работы со строками.

Импорт и использование пакета strings:

package main

import "strings"

func main() {
  upper := strings.ToUpper("заглавные буквы")
  println(upper) // Output: ЗАГЛАВНЫЕ БУКВЫ
}

Ключевое слово import нужно для импорта используемых пакетов. Чтобы использовать функции из пакета strings, нужно:

  • написать название пакета;
  • поставить точку;
  • вызвать нужную функцию из пакета.

Первое серверное приложение “Hello Web”

В пакете http содержится все необходимое для создания веб-сервера.

package main

import (
  "log"
  "net/http"
)

func HelloWeb(w http.ResponseWriter, r *http.Request) {
  w.Write([]byte("Hello Web!"))
}

func main() {
  http.HandleFunc("/", HelloWeb)
  err := http.ListenAndServe("localhost:9999", nil)
  if err != nil {
     log.Println("listen and serve:", err)
  }
}

Запустите код. Далее откройте браузер и перейдите по адресу http://localhost:9999/. Вы получите сообщение “Hello Web!

Функция http.HandleFunc устанавливает функцию HelloWeb, по пути /, а http.ListenAndServe запускает сервер по указанному адресу.

Если вы перейдете по указанному адресу, вызовется функция HelloWeb. Функция принимает два аргумента – сам запрос и переменную, позволяющую ответить на запрос. В строке w.Write([]byte(“Hello Web”)) мы отвечаем на запрос обычной строкой.

Поздравляем, вы написали ваш первый веб-сервер на Go!

Литература

  • «Изучаем Go» – Head First, Джек Макгаврен.
  • «Язык программирования Go» – Алан А. А. Донован, Брайан У. Керниган.
  • «Go на практике» – Батчер Мэтт, Фарина Мэтт.

Онлайн ресурсы

Go в “Библиотеке Программиста”

***

Мы пробежались по основам Go: переменные, операторы, управляющие конструкции, функции.

Ценностями языка являются:

  • Простота
  • Эффективность
  • Надежность
  • Продуктивность
  • Дружелюбность

Go современный, широко используемый и востребуемый язык программирования, который стоит начать изучать прямо сейчас.

***

Хочу освоить алгоритмы и структуры данных, но сложно разобраться самостоятельно. Что делать?

Алгоритмы и структуры данных действительно непростая тема для самостоятельного изучения: не у кого спросить и что-то уточнить. Поэтому мы запустили курс «Алгоритмы и структуры данных», на котором в формате еженедельных вебинаров вы:

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

Курс подходит как junior, так и middle-разработчикам.

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

admin
29 января 2017

Изучаем алгоритмы: полезные книги, веб-сайты, онлайн-курсы и видеоматериалы

В этой подборке представлен список книг, веб-сайтов и онлайн-курсов, дающих...