Примеры кода на Go
Практические примеры кода для понимания концепций программирования на Go.
Привет, мир
ОсновыПростая программа Hello World для начала работы с Go.
package main
import "fmt"
func main() {
fmt.Println("Привет, мир!")
}💡 Объяснение
Это классическая первая программа. Она импортирует пакет fmt и использует Println для вывода текста.
Переменные и константы
ОсновыРабота с различными типами переменных и констант в Go.
package main
import "fmt"
func main() {
// Объявление переменных
var name string = "Программирование на Go"
var version float64 = 1.21
// Краткое объявление переменной
isAwesome := true
// Константы
const pi = 3.14159
fmt.Printf("Язык: %s\n", name)
fmt.Printf("Версия: %.2f\n", version)
fmt.Printf("Потрясающий: %t\n", isAwesome)
fmt.Printf("Пи: %f\n", pi)
}💡 Объяснение
Демонстрирует различные способы объявления переменных и констант, а также различные типы данных.
Операции со срезами
Структуры данныхРабота со срезами - динамическими массивами в Go.
package main
import "fmt"
func main() {
// Создание срезов
numbers := []int{1, 2, 3, 4, 5}
// Добавление в срез
numbers = append(numbers, 6, 7, 8)
// Получение подсреза
subset := numbers[2:5]
fmt.Println("Исходный срез:", numbers)
fmt.Println("Подсрез [2:5]:", subset)
fmt.Println("Длина:", len(numbers))
fmt.Println("Ёмкость:", cap(numbers))
// Итерация по срезу
for i, value := range numbers {
fmt.Printf("Индекс: %d, Значение: %d\n", i, value)
}
}💡 Объяснение
Показывает, как создавать, изменять и итерировать по срезам, которые являются одним из наиболее важных типов данных в Go.
Структуры и методы
ООПОпределение структур и методов для создания пользовательских типов.
package main
import "fmt"
// Определение структуры
type Person struct {
Name string
Age int
City string
}
// Метод с приёмником по значению
func (p Person) Greet() string {
return fmt.Sprintf("Привет, я %s из %s", p.Name, p.City)
}
// Метод с приёмником по указателю
func (p *Person) HaveBirthday() {
p.Age++
}
func main() {
// Создание экземпляра структуры
person := Person{
Name: "Алиса",
Age: 25,
City: "Москва",
}
fmt.Println(person.Greet())
fmt.Printf("Возраст до дня рождения: %d\n", person.Age)
person.HaveBirthday()
fmt.Printf("Возраст после дня рождения: %d\n", person.Age)
}💡 Объяснение
Демонстрирует, как определять структуры и прикреплять к ним методы, показывая приёмники по значению и по указателю.
Горутины и каналы
ПараллелизмОсновы параллелизма с горутинами и каналами.
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for job := range jobs {
fmt.Printf("Работник %d обрабатывает задание %d\n", id, job)
time.Sleep(time.Second) // Имитация работы
results <- job * 2
}
}
func main() {
jobs := make(chan int, 100)
results := make(chan int, 100)
// Запуск 3 работников
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// Отправка 5 заданий
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
// Сбор результатов
for r := 1; r <= 5; r++ {
result := <-results
fmt.Printf("Результат: %d\n", result)
}
}💡 Объяснение
Показывает, как использовать горутины для параллельного выполнения и каналы для коммуникации между ними.
Обработка ошибок
Обработка ошибокПравильные паттерны обработки ошибок в Go.
package main
import (
"errors"
"fmt"
)
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("деление на ноль")
}
return a / b, nil
}
func main() {
// Успешная операция
result, err := divide(10, 2)
if err != nil {
fmt.Printf("Ошибка: %v\n", err)
} else {
fmt.Printf("10 / 2 = %.2f\n", result)
}
// Операция с ошибкой
result, err = divide(10, 0)
if err != nil {
fmt.Printf("Ошибка: %v\n", err)
} else {
fmt.Printf("10 / 0 = %.2f\n", result)
}
}💡 Объяснение
Демонстрирует подход Go к обработке ошибок с использованием множественных возвращаемых значений и явной проверки ошибок.
Готовы попробовать эти примеры?
Скопируйте примеры кода и запустите их в Go Playground или в вашей локальной среде.