Основи синтаксису та типізації в Go
Основи синтаксису 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 є те, що змінні не можуть бути неініціалізованими. Якщо ви оголошуєте змінну, не надавши їй початкового значення, вона автоматично отримує своє «нульове значення». Це усуває цілий клас помилок, пов'язаних із використанням змінних, що містять «сміття».
| Тип | Нульове значення |
|---|---|
int | 0 |
float64 | 0.0 |
string | "" (порожній рядок) |
bool | false |
| вказівники, інтерфейси, слайси, мапи, канали | 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)
}
Який пакет та функція є точкою входу для виконання програми на Go?
Чому ми можемо викликати функцію Println з пакета fmt (наприклад, fmt.Println()) в нашому коді?
Розуміння цих базових концепцій — пакетів, змінних, типів та констант — є ключовим для написання чистого та ефективного коду на Go.