Примеры из программы

Смотрите на идею.
Запускайте свой код.

Небольшие самостоятельные программы показывают ключевые приёмы Go. Каждый пример взят из урока маршрута и готов к запуску.

8 примеров из уроковКаждый можно запустить локально

Практика в коде

Одна задача — один приём.

Сначала прочитайте пояснение, затем запустите программу командой из карточки. Полный урок поможет разобраться глубже и предложит упражнение.

01Первые программы25 мин

Переменные и вывод

Объявляем значения, выбираем типы и выводим полезные данные.

Открыть урок
main.go
package main

import "fmt"

func main() {
	name := "Мира"
	pages := 248
	weeks := 4
	perWeek := (pages + weeks - 1) / weeks
	fmt.Printf("%s: %d страниц, примерно %d в неделю\n", name, pages, perWeek)
}

Запустить локально

go run main.go

Объявлять переменные разными способами · Подбирать типы для строк, чисел и символов

02Первые программы35 мин

Условия и циклы

Выбираем ветку выполнения и повторяем операции для каждого элемента.

Открыть урок
main.go
package main

import "fmt"

func main() {
	weight := 3
	price := 120
	if weight > 1 {
		price += (weight - 1) * 25
	}
	fmt.Println("доставка:", price)
	for n := 1; n <= 5; n++ {
		kind := "нечётное"
		if n%2 == 0 {
			kind = "чётное"
		}
		fmt.Println(n, kind)
	}
}

Запустить локально

go run main.go

Строить if/else без лишних условий · Повторять вычисления циклом

03Функции и коллекции35 мин

Функции и результаты

Выделяем повторяемые действия в функции с понятными входами и выходами.

Открыть урок
main.go
package main

import "fmt"

func ticketTotal(prices ...int) int {
	total := 0
	for _, price := range prices {
		total += price
	}
	return total
}

func dailyBudget(budget, days int) (int, int) {
	return budget / days, budget % days
}

func main() {
	total := ticketTotal(1200, 900, 900)
	daily, remainder := dailyBudget(10000, 3)
	fmt.Println("билеты:", total, "в день:", daily, "остаток:", remainder)
}

Запустить локально

go run main.go

Передавать аргументы · Возвращать результаты

04Функции и коллекции40 мин

Массивы и срезы

Храним упорядоченные значения и безопасно добавляем новые элементы.

Открыть урок
main.go
package main

import "fmt"

func main() {
	minutes := []int{20, 30, 25, 15, 40}
	total := 0
	for _, value := range minutes {
		total += value
	}
	minutes = append(minutes, 30)
	fmt.Println("итого:", total, "среднее:", total/5, "дней:", len(minutes))
}

Запустить локально

go run main.go

Различать массив и срез · Перебирать элементы

05Функции и коллекции30 мин

Карты и поиск по ключу

Представляем словарь данных с быстрым доступом по ключу.

Открыть урок
main.go
package main

import (
	"fmt"
	"sort"
)

func main() {
	zones := map[string]int{"Казань": 3, "Томск": 7}
	if offset, ok := zones["Казань"]; ok {
		fmt.Println("смещение:", offset)
	}
	zones["Пермь"] = 5
	cities := make([]string, 0, len(zones))
	for city := range zones {
		cities = append(cities, city)
	}
	sort.Strings(cities)
	for _, city := range cities {
		fmt.Println(city, zones[city])
	}
}

Запустить локально

go run main.go

Создавать map с ключом и значением · Проверять наличие ключа

06Типы и надёжность45 мин

Ошибки и проверка входа

Возвращаем ошибки вызывающему коду и тестируем корректные и неверные данные.

Открыть урок
main.go
package main

import (
	"fmt"
	"strconv"
)

func parsePort(text string) (int, error) {
	port, err := strconv.Atoi(text)
	if err != nil {
		return 0, fmt.Errorf("invalid port %q: %w", text, err)
	}
	if port < 1 || port > 65535 {
		return 0, fmt.Errorf("port out of range: %d", port)
	}
	return port, nil
}

func main() {
	port, err := parsePort("8080")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("port:", port)
}

Запустить локально

go run main.go

Сигнализировать об ошибке через возвращаемое значение · Проверять формат и диапазоны

07Параллельность и качество50 мин

Горутины и каналы

Запускаем независимые вычисления и собираем результаты через канал.

Открыть урок
main.go
package main

import (
	"fmt"
	"sync"
)

func main() {
	distances := []int{60, 90}
	results := make(chan int, len(distances))
	var workers sync.WaitGroup
	for _, distance := range distances {
		workers.Add(1)
		go func(km int) {
			defer workers.Done()
			results <- km / 30
		}(distance)
	}
	workers.Wait()
	close(results)
	total := 0
	for hours := range results {
		total += hours
	}
	fmt.Println("общее время:", total)
}

Запустить локально

go run main.go

Запускать функцию в goroutine · Передавать результат по каналу

08Проекты и производительность60 мин

Проект: отчёт расходов из CSV

Параллельно анализируем выгрузки, проверяем строки и сравниваем расходы по файлам.

Открыть урок
main.go
package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"log"
	"strconv"
	"strings"
	"sync"
)

type summary struct { cents, invalid int }

func summarizeCSV(text string) (summary, error) {
	var out summary
	reader := csv.NewReader(strings.NewReader(text))
	reader.FieldsPerRecord = -1
	if _, err := reader.Read(); err != nil {
		return out, fmt.Errorf("read CSV header: %w", err)
	}
	for {
		record, err := reader.Read()
		if err == io.EOF {
			return out, nil
		}
		if err != nil {
			return out, fmt.Errorf("read CSV record: %w", err)
		}
		if len(record) != 2 || strings.TrimSpace(record[0]) == "" {
			out.invalid++
			continue
		}
		cents, err := strconv.Atoi(record[1])
		if err != nil || cents < 0 {
			out.invalid++
			continue
		}
		out.cents += cents
	}
}

func main() {
	documents := []string{
		"category,cents\nfood,1200\ntravel,300\nfood,invalid",
		"category,cents\nbooks,800",
		"category,cents\nrefund,-100",
	}
	results := make(chan summary, len(documents))
	var workers sync.WaitGroup
	for _, document := range documents {
		workers.Add(1)
		go func(text string) {
			defer workers.Done()
			item, err := summarizeCSV(text)
			if err != nil {
				log.Printf("summarize CSV: %v", err)
				return
			}
			results <- item
		}(document)
	}
	workers.Wait()
	close(results)
	totalCents, rejected := 0, 0
	for item := range results {
		totalCents += item.cents
		rejected += item.invalid
	}
	fmt.Println("расходы в центах:", totalCents, "отклонённых записей:", rejected)
}

Запустить локально

go run main.go

Читать записи CSV · Проверять формат и значения каждой строки

Продолжайте маршрут

Пример показывает шаг. Урок помогает пройти путь.

Выберите тему, выполните упражнение и проверьте решение по понятным критериям.

Смотреть все уроки