πŸ’¬ Π§Ρ‚ΠΎ это Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ‚Π°ΠΊΠΎΠ΅? Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ структуры β€” это конструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ…ΠΎΠ΄ΠΎΠΌ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Благодаря ΠΈΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ: «Ссли A, Ρ‚ΠΎ сдСлай BΒ», ΠΈΠ»ΠΈ «выполняй C Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ станСт DΒ».

Π’ повсСднСвной ΠΆΠΈΠ·Π½ΠΈ Ρ‚Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΡˆΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ:

  • Если ΠΈΠ΄Ρ‘Ρ‚ доТдь β€” Π±Π΅Ρ€Ρ‘ΡˆΡŒ Π·ΠΎΠ½Ρ‚.
  • Пока Π½Π΅ наступит ΠΏΠΎΠ»Π½ΠΎΡ‡ΡŒ β€” ΠΏΡ€Π°Π·Π΄Π½ΡƒΠ΅ΡˆΡŒ.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ это рСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ условий ΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ². Π”Π°Π²Π°ΠΉ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ ΠΏΠΎ порядку.


🧭 УсловныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

УсловныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли выполняСтся Π½Π΅ΠΊΠΎΠ΅ условиС (логичСскоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅).

if

x := 10
if x > 5 {
    fmt.Println("x большС 5")
}

МоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ else, Ссли Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС:

if x%2 == 0 {
    fmt.Println("x β€” Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅")
} else {
    fmt.Println("x β€” Π½Π΅Ρ‡Ρ‘Ρ‚Π½ΠΎΠ΅")
}

Допустимо ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ прямо Π²Π½ΡƒΡ‚Ρ€ΠΈ if:

if y := 7; y < 10 {
    fmt.Println("y мСньшС 10")
}

switch

switch β€” это способ Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ if-else, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ switch.

day := "срСда"
switch day {
case "понСдСльник":
    fmt.Println("Начало Π½Π΅Π΄Π΅Π»ΠΈ")
case "пятница":
    fmt.Println("ΠŸΠΎΡ‡Ρ‚ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅")
default:
    fmt.Println("ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ дСнь")
}
  • switch автоматичСски прСрываСтся послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ совпадСния β€” break ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.
  • МоТно ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:
switch day {
case "суббота", "Π²ΠΎΡΠΊΡ€Π΅ΡΠ΅Π½ΡŒΠ΅":
    fmt.Println("Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ!")
}

πŸ” Π¦ΠΈΠΊΠ»Ρ‹

Π¦ΠΈΠΊΠ»Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ дСйствия ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ. НапримСр, вывСсти Π½Π° экран числа ΠΎΡ‚ 1 Π΄ΠΎ 10 ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π²Π²ΠΎΠ΄, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π²Π²Π΅Π΄Ρ‘Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π’ Go Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ†ΠΈΠΊΠ» β€” for, Π½ΠΎ ΠΎΠ½ ΡƒΠΌΠ΅Π΅Ρ‚ всё.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ for

for i := 0; i < 5; i++ {
    fmt.Println(i)
}

ОбъяснСниС:

  • i := 0 β€” Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
  • i < 5 β€” условиС продолТСния
  • i++ β€” шаг (ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ i Π½Π° 1)

Как while

x := 5
for x > 0 {
    fmt.Println(x)
    x--
}

Π­Ρ‚ΠΎΡ‚ Ρ†ΠΈΠΊΠ» Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΏΠΎΠΊΠ° x большС нуля.

БСсконСчный Ρ†ΠΈΠΊΠ»

for {
    fmt.Println("Π‘Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ")
    break // НС Π·Π°Π±ΡƒΠ΄ΡŒ Π²Ρ‹ΠΉΡ‚ΠΈ ;)
}

⏭ Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ

Иногда Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°:

  • break β€” Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» ΠΈΠ»ΠΈ switch.
  • continue β€” пропускаСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ.
for i := 1; i <= 5; i++ {
    if i == 3 {
        continue // ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌ 3
    }
    fmt.Println(i)
}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

1
2
4
5

πŸ”„ Π¦ΠΈΠΊΠ» for range β€” итСрация ΠΏΠΎ коллСкциям

for range β€” ΠΈΠ΄ΠΈΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ способ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° элСмСнтов Π² Go. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с массивами, слайсами, ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠΈ, строками ΠΈ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ.

Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ слайсам ΠΈ массивам

package main

import "fmt"

func main() {
    numbers := []int{10, 20, 30, 40}
    
    // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈ индСкс, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    for index, value := range numbers {
        fmt.Printf("ИндСкс %d: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ %d\n", index, value)
    }
    
    // Волько значСния (ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ индСкс)
    for _, value := range numbers {
        fmt.Printf("Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: %d\n", value)
    }
    
    // Волько индСксы
    for index := range numbers {
        fmt.Printf("ИндСкс: %d\n", index)
    }
}

Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ ΠΊΠ°Ρ€Ρ‚Π°ΠΌ

students := map[string]int{
    "Алиса": 95,
    "Π‘ΠΎΠ±":   87,
    "ΠšΠ°Ρ‚Ρ":  92,
}

for name, score := range students {
    fmt.Printf("%s ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» %d Π±Π°Π»Π»ΠΎΠ²\n", name, score)
}

Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ строкам (rune Π·Π° rune)

text := "ΠŸΡ€ΠΈΠ²Π΅Ρ‚"
for index, char := range text {
    fmt.Printf("ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ %d: символ %c\n", index, char)
}

πŸ’‘ for range автоматичСски ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ UTF-8 ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, поэтому ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с русскими символами.


πŸ”’ defer β€” ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

defer β€” ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ критичСски ваТная конструкция Π² Go.

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ синтаксис

package main

import "fmt"

func main() {
    fmt.Println("Начало")
    defer fmt.Println("Π­Ρ‚ΠΎ выполнится Π² ΠΊΠΎΠ½Ρ†Π΅")
    fmt.Println("Π‘Π΅Ρ€Π΅Π΄ΠΈΠ½Π°")
    fmt.Println("ΠŸΠΎΡ‡Ρ‚ΠΈ ΠΊΠΎΠ½Π΅Ρ†")
    // defer выполнится здСсь автоматичСски
}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Начало
Π‘Π΅Ρ€Π΅Π΄ΠΈΠ½Π°
ΠŸΠΎΡ‡Ρ‚ΠΈ ΠΊΠΎΠ½Π΅Ρ†
Π­Ρ‚ΠΎ выполнится Π² ΠΊΠΎΠ½Ρ†Π΅

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ defer (Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС)

func example() {
    defer fmt.Println("ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ defer")
    defer fmt.Println("Π’Ρ‚ΠΎΡ€ΠΎΠΉ defer")
    defer fmt.Println("Π’Ρ€Π΅Ρ‚ΠΈΠΉ defer")
    fmt.Println("Основной код")
}

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Основной код
Π’Ρ€Π΅Ρ‚ΠΈΠΉ defer
Π’Ρ‚ΠΎΡ€ΠΎΠΉ defer
ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ defer

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ β€” Ρ€Π°Π±ΠΎΡ‚Π° с рСсурсами

package main

import (
    "fmt"
    "os"
)

func readFile(filename string) error {
    file, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer file.Close() // βœ… Π€Π°ΠΉΠ» Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ закроСтся
    
    // Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с Ρ„Π°ΠΉΠ»ΠΎΠΌ...
    fmt.Println("Π€Π°ΠΉΠ» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΈ обрабатываСтся")
    
    // Π”Π°ΠΆΠ΅ Ссли здСсь ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ошибка,
    // file.Close() всС Ρ€Π°Π²Π½ΠΎ выполнится
    return nil
}

Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ defer

  • Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ сСтСвых соСдинСний
  • ОсвобоТдСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ (mutex unlock)
  • Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
  • ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рСсурсов
  • ВосстановлСниС послС panic

⚠️ defer выполняСтся Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ panic, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ очистки рСсурсов.


🏷 ΠœΠ΅Ρ‚ΠΊΠΈ (labels) для управлСния Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ

ΠœΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ, указывая Ρ‚ΠΎΡ‡Π½ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Ρ†ΠΈΠΊΠ» Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ.

package main

import "fmt"

func findInMatrix() {
    matrix := [][]int{
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9},
    }
    
    target := 5
    
OuterLoop: // ΠœΠ΅Ρ‚ΠΊΠ° для внСшнСго Ρ†ΠΈΠΊΠ»Π°
    for i, row := range matrix {
        for j, value := range row {
            if value == target {
                fmt.Printf("НайдСно %d Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ [%d][%d]\n", target, i, j)
                break OuterLoop // Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· всСх Ρ†ΠΈΠΊΠ»ΠΎΠ²
            }
        }
    }
}

ИспользованиС continue с ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ

func skipEvenRows() {
    matrix := [][]int{{1, 2}, {3, 4}, {5, 6}}
    
RowLoop:
    for i, row := range matrix {
        if i%2 == 0 {
            continue RowLoop // ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌ Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ строки
        }
        for _, value := range row {
            fmt.Printf("%d ", value)
        }
        fmt.Println()
    }
}

πŸ§ͺ ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

package main

import (
    "fmt"
    "strings"
)

func processStudentData() {
    students := map[string][]int{
        "Алиса": {95, 87, 92},
        "Π‘ΠΎΠ±":   {78, 85, 90},
        "ΠšΠ°Ρ‚Ρ":  {88, 91, 89},
    }
    
    fmt.Println("πŸ“Š Анализ успСваСмости студСнтов")
    fmt.Println(strings.Repeat("=", 40))
    
    for name, grades := range students {
        defer fmt.Printf("βœ… ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° %s Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°\n", name)
        
        var total, count int
        var hasLowGrade bool
        
        fmt.Printf("\nπŸ‘€ Π‘Ρ‚ΡƒΠ΄Π΅Π½Ρ‚: %s\n", name)
        fmt.Print("πŸ“ ΠžΡ†Π΅Π½ΠΊΠΈ: ")
        
        for i, grade := range grades {
            fmt.Printf("%d", grade)
            if i < len(grades)-1 {
                fmt.Print(", ")
            }
            
            total += grade
            count++
            
            if grade < 80 {
                hasLowGrade = true
            }
        }
        
        average := float64(total) / float64(count)
        fmt.Printf("\nπŸ“ˆ Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ Π±Π°Π»Π»: %.1f\n", average)
        
        // ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ статус студСнта
        switch {
        case average >= 90:
            fmt.Println("πŸ† Бтатус: ΠžΡ‚Π»ΠΈΡ‡Π½ΠΈΠΊ")
        case average >= 80:
            fmt.Println("⭐ Бтатус: Π₯ΠΎΡ€ΠΎΡˆΠΈΡΡ‚")
        case hasLowGrade:
            fmt.Println("⚠️  Бтатус: Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ внимания")
        default:
            fmt.Println("πŸ“š Бтатус: Π£Π΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ")
        }
    }
}

func main() {
    processStudentData()
}

πŸ’‘ Π˜Π΄ΠΈΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ Go ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹

Early Return (Ρ€Π°Π½Π½ΠΈΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚)

func validateUser(user User) error {
    if user.Name == "" {
        return errors.New("имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ")
    }
    
    if user.Age < 0 {
        return errors.New("возраст Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ")
    }
    
    if user.Email == "" {
        return errors.New("email обязатСлСн")
    }
    
    // Основная Π»ΠΎΠ³ΠΈΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли всС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹
    return nil
}

Guard Clauses (Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹Π΅ условия)

func processOrder(order *Order) error {
    // Π—Π°Ρ‰ΠΈΡ‚Π½Ρ‹Π΅ условия Π² Π½Π°Ρ‡Π°Π»Π΅
    if order == nil {
        return errors.New("Π·Π°ΠΊΠ°Π· Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ nil")
    }
    
    if len(order.Items) == 0 {
        return errors.New("Π·Π°ΠΊΠ°Π· Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹")
    }
    
    // Основная Π»ΠΎΠ³ΠΈΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ
    // ...
    return nil
}

πŸ’‘ Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ конструкции β€” это каркас любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π£ΠΌΠ΅Π½ΠΈΠ΅ эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… β€” ΠΊΠ»ΡŽΡ‡ ΠΊ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΌΡƒ ΠΈ Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ.

πŸ“Œ Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΈΠ· Π³Π»Π°Π²Ρ‹

  • УсловныС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ (if, else, switch) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π² зависимости ΠΎΡ‚ условий.
  • Π¦ΠΈΠΊΠ» for β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ повторСния ΠΊΠΎΠ΄Π°.
  • for range β€” ΠΈΠ΄ΠΈΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ способ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ коллСкциям Π² Go.
  • defer β€” критичСски ваТная конструкция для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ очистки рСсурсов.
  • ΠœΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Ρ†ΠΈΠΊΠ»Π°ΠΌΠΈ.
  • Early return ΠΈ guard clauses Π΄Π΅Π»Π°ΡŽΡ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ ΠΈ Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ.
  • МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ break ΠΈ continue для управлСния Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ Ρ†ΠΈΠΊΠ»Π°.
  • Π­Ρ‚ΠΈ конструкции ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

πŸ›  ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ упраТнСния

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1: Анализ чисСл

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая:

  1. Π‘ΠΎΠ·Π΄Π°Π΅Ρ‚ слайс чисСл ΠΎΡ‚ 1 Π΄ΠΎ 20
  2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ for range для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π°
  3. Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа
  4. ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ сумму Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… чисСл
  5. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ defer для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΉ суммы

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 2: ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° тСкста

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая:

  1. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку тСкста
  2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ for range для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° символов
  3. ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ количСство гласных ΠΈ согласных
  4. Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ Π·Π½Π°ΠΊΠΈ прСпинания
  5. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² Π²ΠΈΠ΄Π΅ ΠΊΠ°Ρ€Ρ‚Ρ‹

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 3: Поиск Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ поиска элСмСнта Π² Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΌ массивС:

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ с ΠΌΠ΅Ρ‚ΠΊΠ°ΠΌΠΈ
  2. ΠŸΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ элСмСнта Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΈΠ· всСх Ρ†ΠΈΠΊΠ»ΠΎΠ²
  3. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ элСмСнта
  4. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ defer для логирования Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ поиска