Golang: основи для початківців [*]


Golang, або Go – мова програмування, початок якого був покладений в 2007 році співробітниками компанії Google: Робертом Гризмером, Робом Пайком і Кеном Томпсоном.

Це швидка, статично типізована компільована мова, при використанні якої створюється враження використання динамично типизованої та інтерпретуємої мови.

Розмір програм на Go розпочинається з 3 рядків і може досягати декількох мільйонів, записаних в один або декілька файлів з розширенням .go. Сучасні текстові редактори, наприклад, vim, підтримують його синтаксис.

Налаштування оточення

Спершу викачаємо 64-бітову версію Go з офіційного сайту. Залежно від використовуваної операційної системи виконуємо наступні дії.

UNIX / Linux / MacOS X / FreeBSD

Витягаємо викачаний архів в теку /usr/local/go. Наприклад:

tar - C /usr/local - xzf go1.8.3.linux - amd64.tar.gz

Додаємо теку /usr/local/go/bin в змінну оточення PATH:

export PATH=$PATH:/usr/local/go/bin

Windows

Використовуваєм MSI файл і слідуємо інструкції. За умовчанням інструменти Go розміщуються в теці З: Go. При установці тека C :Gobin автоматично додасться в системну змінну PATH.

Щоб зміни набули чинності, перезапустимо усі відкриті вікна емуляторів терміналу.

Перевіряємо коректність установки, створивши і виконавши файл C:ProjectsGotest.go:

package mainimport " fmt" func main (){ fmt.Println ("Привіт, Tproger"!)}

Виконаємо цей код і отримаємо наступний результат:

Синтаксис

Пакети

Кожна програма на мові Go складається з пакетів (packages). Пакет main – головний, з нього розпочинається виконання програми. У наведеному вище прикладі імпортується пакет fmt.

Імпорт

Імпорт пакетів можна описати двома способами.

Так:

import " fmt" import " math"

чи так:

import ( "fmt" " math")

Функції

Загальна форма визначення функції виглядає таким чином:

func function_name ( [список параметрів] ) [повертані типи даних] { тіло функції}

Кількість і тип вхідних аргументів може бути будь-яким. Для прикладу опишемо функцію add з двома вхідними параметрами формату int:

package mainimport " fmt" func add (a int, b int) int { return a + b}func main (){ fmt.Println ("Сума рівна ", add (10, 19))}

Виконаємо цей код і отримаємо наступний результат:

Змінні

Визначення змінної в Go означає передачу компілятору інформації про тип даних, а так само про місце і об’єм сховища, яке створюється для цієї змінної. Визначати змінні одного типу можна по одному і списком. Загальна форма така:

var [перелік змінних] [тип даних];

За допомогою оператора var визначуваний перелік змінних, причому тип даних вказуємо у кінці вираження.

Оголошення можливо як на рівні пакету, так і на рівні функції. Розглянемо приклад:

package mainimport " fmt" var node, golang, angular boolfunc main (){ var x int fmt.Println (x, node, golang, angular)}

Виконаємо цей код і отримаємо наступний результат:

Оператор циклу

У мові Go один оператор циклу – це for, який повторює список інструкцій задану кількість разів. Цикл складається з трьох виразів:

  1. Ініціалізація. Виконується перед першою ітерацією.
  2. Умова. Обчислюється перед кожною ітерацією.
  3. Інкремент. Виконується після кожної ітерації.

Загальна форма циклу виглядає так:

for [умова |  (ініціалізація; умова; інкремент)  | діапазон] { [тіло циклу]}

При ініціалізації коротко оголошуються змінні, які доступні тільки в межах циклу.

Цикл зупиняє свою роботу, коли умова набуває значення false.

Примітка На відміну від таких мов, як C, Java і JavaScript, перераховані вирази циклу не виділяються дужками. В даному випадку обов’язкові лише фігурні дужки, що обрамляють тіло циклу.

Розглянемо приклад програми :

package mainimport " fmt" func main (){ sum := 0 for i := 0; i < 8; i++{ sum += i } fmt.Println ("Сума рівна ", sum)}

Виконаємо цей код і отримаємо наступний результат:

Умовний оператор

Форма визначення умовного оператора в Go виглядає таким чином:

if [умова] { ...}

Якщо вираження в полі умови істинно, код, розміщений між фігурними дужками, виконається.

Умова описується значенням, змінною або вираженням. Наприклад:

  • true - виконується завжди;
  • a < 10 - виконується, коли a менше 10;
  • (a < b) || (a < c) - виконується, коли a менше b чи a менше c;
  • (a < b) && (a < c) - виконується, коли a менше b і a менше c.

Розглянемо приклад програми :

package mainimport ( "fmt") func main (){ if true { fmt.Println ("Цей вираз виконається завжди") } if false { fmt.Println ("Цей вираз не виконається ніколи")  }}

Виконаємо цей код і отримаємо наступний результат:

Масиви

Go також підтримує масиви, які представляють з себе структуру даних фіксованого розміру, що складається з елементів одного типу. Масиви використовуються для зберігання наборів даних, але корисно мати на увазі під ними колекцію змінних одного типу.

Щоб оголосити масив, необхідно вказати тип і необхідну кількість елементів таким чином:

var наименование_переменной [розмір] тип_переменной

Наприклад, щоб створити масив balance, що складається з десяти елементів типу float32, використовуємо наступне вираження:

var balance [10] float32

Якщо значення елементів відомі, для визначення масиву допустимо використати наступну конструкцію:

var balance =[]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

Довжина масиву не змінюється, тому що є частиною типу даних. Це здається обмеженим рішенням, але не хвилюйтеся: в Go реалізована комфортна робота з масивами.

Розглянемо приклад програми :

package mainimport " fmt" func main (){
var a [2]string a[0] = "Привіт" a[1] = "Tproger" fmt.Println (a[0], a[1]) fmt.Println (a) primes :=[6]int{2, 3, 5, 7, 11, 13} fmt.Println (primes)}

Виконаємо цей код і отримаємо наступний результат:

Зрізи

Зрізи (Slices) в Go - абстракція над масивами. Хоча вбудованих способів збільшити розмір масиву динамічно або зробити вкладений масив в Go немає, зрізи прибирають це обмеження. Вони надають корисні функції і широко використовуються програмістами.

Оголосити зріз можна як масив, але без вказівки розміру або за допомогою функції make:

var numbers []int /* зріз невизначеного розміру *//* numbers =[]int{0,0,0,0,0} */
numbers = make ([]int, 5,5) /* зріз завдовжки і місткістю рівною 5 */

Розмір масиву фіксований, а у зрізу змінюваний. По суті, зріз - загальніший вигляд масиву.

Тип []T - зріз з елементами типу T.

a[0: 5] - зріз 5 елементів масиву a.

Розглянемо приклад програми :

package mainimport " fmt" func main (){ primes :=[6]int{2, 3, 5, 7, 11, 13} fmt.Println (primes) var s []int = primes[1: 4] fmt.Println (s)}

Виконаємо цей код і отримаємо наступний результат:

Структури

Структура (structure) - призначений для користувача тип даних, який окрім іншого комбінує елементи різних типів. Щоб оголосити структуру, використовуємо вирази type і struct.

Struct визначає тип даних, якому відповідає два і більше елементів.

Type зв'язує задане ім'я з описом структури.

Форма опису виглядає таким чином:

type struct_variable_type struct { member definition; member definition; ... member definition;}

Як тільки структура типу визначена, він може використовуватися при оголошенні нових змінних :

variable_name := structure_variable_type {значение1, значение2...значениеN}

Щоб отримати доступ до елементів структури, використуємо оператор доступу до елементу. Розглянемо на прикладі:

package mainimport " fmt" type Vertex struct { X int Y int}func main (){ v := Vertex{1, 2} v.X = 4 fmt.Println (v.X)}

Виконаємо цей код і отримаємо наступний результат:

Чому саме Golang?

Концепція мови Golang розроблена на основі досвіду рішення повсякденних завдань і не переслідує мету зробити прорив в програмуванні. Крім того, Go не реалізує ряд функцій, які роблять інші мови (C++, Java і Python) настільки потужними. Але є три причини, щоб замислитися про використання цієї мови.

Читабельність

Як тільки звик до синтаксису Go, прочитати чужий код - тривіальне завдання.

У кожної людини власний "правильний" спосіб робити речі, тому Go нав'язує свій стиль програмування. В результаті питання на зразок використання або невикористання фігурних дужок відпадають, і залишається тільки писати код за заданими правилами.

Швидкість

За короткий проміжок часу можна написати швидку програму.

Продуктивність роботи пакету на Go, можливо, буде менше, ніж при використанні С, зате швидкість компіляції для великих програм буде вища. Для більшості проектів - прийнятний компроміс, причому при необхідності досить просто переписати код на мові Go.

Менше помилок

Більшість помилок виникають в неперевіреному або складному коді.

Go надає зручні засоби для тестування. Крім того, строга типізація усуває помилки на зразок випадкового порівняння кількості яблук з кількістю груш, які визначаються ще на етапі компіляції.

Висновок

Якщо хочете зануритися глибше у вивчення, подивитеся нашу підбірку безкоштовних книг зі знайомства з Go, а головне - почніть створювати маленькі програми, щоб на практиці зрозуміти тонкощі мови. Удачі!

Переклад статті "Basics of Golang [For Beginners]", з використанням "Golang Beginner Tutorial"

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *