No history yet

Основи синтаксису Go

Структура Go програми

Кожна програма на Go складається з пакетів. Програма починає виконуватися в пакеті main. Це правило. Якщо ваш файл належить до пакета main і містить функцію з назвою main, компілятор Go розуміє, що це точка входу — місце, звідки потрібно стартувати.

package main

import "fmt"

// Це головна функція, з якої починається виконання
func main() {
    fmt.Println("Привіт, світе!")
}

Рядок package main оголошує, що цей файл є частиною пакета main. Рядок import "fmt" повідомляє компілятору, що ми хочемо використовувати функціонал з пакета fmt, який надає функції для форматованого введення та виведення, наприклад, друку в консоль.

Імена, які починаються з великої літери в Go, є експортованими. Це означає, що вони видимі та доступні з інших пакетів, які імпортують цей пакет. Наприклад, функція Println з пакета fmt починається з великої літери P, тому ми можемо викликати її з нашого пакета main.

Змінні та Типи

У Go є два основних способи оголошення змінних. Перший — це використання ключового слова var. Цей спосіб є більш явним і дозволяє вказати тип, навіть якщо початкове значення не надано.

package main

import "fmt"

func main() {
    // Оголошення змінної 'name' типу string
    var name string = "Alice"

    // Оголошення змінної 'age' типу int без початкового значення
    var age int

    fmt.Println(name)
    fmt.Println(age)
}

Однак, частіше за все ви будете зустрічати короткий синтаксис оголошення :=. Він використовується всередині функцій, автоматично виводить тип змінної з початкового значення і робить код більш лаконічним. Це ідіоматичний, тобто найпоширеніший та рекомендований, спосіб для локальних змінних.

Запам'ятайте: := можна використовувати тільки всередині функцій. Для оголошення змінних на рівні пакета завжди використовується var.

Go — це мова зі статичною типізацією. Це означає, що тип кожної змінної відомий на етапі компіляції, і ви не можете змінити його пізніше. Також у Go немає неявного приведення типів. Якщо ви спробуєте додати int до float64, компілятор видасть помилку. Потрібно явно перетворити один тип на інший.

package main

import "fmt"

func main() {
    count := 5
    price := 24.99

    // Це викличе помилку: invalid operation: count * price (mismatched types int and float64)
    // total := count * price 

    // Правильний підхід — явне приведення типів
    total := float64(count) * price
    fmt.Printf("Загальна вартість: %.2f\n", total)
}

Основні базові типи в Go включають:

  • int: Ціле число (розмір залежить від архітектури, зазвичай 32 або 64 біти).
  • float64: Число з плаваючою комою подвійної точності.
  • string: Послідовність байтів, зазвичай представляє текст в кодуванні UTF-8.
  • bool: Логічний тип, може мати значення true або false.

Нульові значення

Важливою особливістю Go є те, що змінні не можуть бути неініціалізованими. Якщо ви оголошуєте змінну, не надавши їй початкового значення, вона автоматично отримує своє «нульове значення». Це усуває цілий клас помилок, пов'язаних із використанням змінних, що містять «сміття».

ТипНульове значення
int0
float640.0
string"" (порожній рядок)
boolfalse
вказівники, інтерфейси, слайси, мапи, каналиnil

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

Константи та iota

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

package main

import "fmt"

const Pi = 3.14159
const IsProduction = false

func main() {
    const World = "Світ"
    fmt.Println("Привіт,", World)
    fmt.Println("Число Пі:", Pi)
    fmt.Println("Продакшн режим:", IsProduction)
}

Для створення послідовностей констант Go надає спеціальний ідентифікатор iota. У блоці const, iota починається з 0 і збільшується на 1 для кожної наступної константи. Це зручно для створення перерахувань (enums) або наборів пов'язаних значень.

package main

import "fmt"

const (
    Sunday = iota // 0
    Monday        // 1
    Tuesday       // 2
    Wednesday     // 3
    Thursday      // 4
    Friday        // 5
    Saturday      // 6
)

func main() {
    fmt.Println("Понеділок — це день номер", Monday)
    fmt.Println("Субота — це день номер", Saturday)
}

iota можна використовувати і в більш складних виразах для створення значень. Наприклад, для створення бітових масок.

package main

import "fmt"

const (
    Read = 1 << iota // 1 << 0 == 1
    Write          // 1 << 1 == 2
    Execute        // 1 << 2 == 4
)

func main() {
    permissions := Read | Write // 1 | 2 == 3
    fmt.Printf("Права доступу: %b\n", permissions) // Виведе: 11

    // Перевірка прав
    canRead := permissions & Read == Read
    canWrite := permissions & Write == Write
    canExecute := permissions & Execute == Execute
    
    fmt.Println("Можна читати:", canRead)
    fmt.Println("Можна писати:", canWrite)
    fmt.Println("Можна виконувати:", canExecute)
}
Quiz Questions 1/6

Який пакет та функція є точкою входу для виконання програми на Go?

Quiz Questions 2/6

Чому ми можемо викликати функцію Println з пакета fmt (наприклад, fmt.Println()) в нашому коді?

Розуміння цих базових концепцій — пакетів, змінних, типів та констант — є ключовим для написання чистого та ефективного коду на Go.