1 Обзор условных операторов

Условные операторы - важные инструменты для управления логическим потоком программирования. В Golang условные операторы похожи на операторы в других языках программирования, но у них есть свои особенности. Они позволяют нам решать, какой код выполнять в зависимости от условий true или false, что значительно повышает гибкость и поддерживаемость кода.

2 Оператор if

2.1 Основное использование оператора if

Оператор if является наиболее простым условным оператором в языке Go. Его синтаксис следующий:

if условие {
    // Код для выполнения, когда условие true
}

Вот простой пример:

package main

import "fmt"

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

Этот код проверит, больше ли x 5, и если да, то выполнит операцию печати.

2.2 Условные выражения

Условные выражения состоят из операторов сравнения (например, ==, !=, <, >, <=, >=) и логических операторов (например, && (И), || (ИЛИ), ! (НЕ)).

Например, чтобы проверить, находится ли переменная в определенном диапазоне:

y := 20
if y >= 10 && y <= 30 {
    fmt.Println("y находится между 10 и 30")
}

В приведенном выше условном выражении используется логический оператор &&, чтобы гарантировать, что значение y находится между 10 и 30.

2.3 Структура if...else и else if

Если условие if не выполняется, мы можем использовать else для выполнения альтернативного блока кода. Оператор else if позволяет нам проверять несколько условий. Вот пример:

score := 88

if score >= 90 {
    fmt.Println("Отлично")
} else if score >= 80 {
    fmt.Println("Хорошо")
} else if score >= 70 {
    fmt.Println("Средне")
} else {
    fmt.Println("Ниже среднего")
}

Этот код будет печатать разные оценки в зависимости от значения score.

3 Оператор switch

3.1 Основный синтаксис оператора switch

Оператор switch - это более краткий условный оператор ветвления, особенно подходящий для ситуаций, когда необходимо оценить несколько значений. Основной синтаксис оператора switch следующий:

switch выражение {
case значение1:
    // Код для выполнения, когда соответствует значение1
case значение2:
    // Код для выполнения, когда соответствует значение2
default:
    // Код для выполнения по умолчанию
}

Если значение выражение соответствует значению, следующему за case, будет выполнен соответствующий блок кода.

3.2 Падение через оператор switch

В операторе switch в Go каждая ветка по умолчанию не переходит к следующему варианту, если не используется ключевое слово fallthrough.

switch num {
case 1:
    fmt.Println("Один")
    fallthrough
case 2:
    fmt.Println("Два")
default:
    fmt.Println("Ни Один ни Два")
}

В приведенном выше коде, если num равно 1, даже если оно соответствует case 1, из-за наличия ключевого слова fallthrough, программа продолжит выполнение кода в case 2 и напечатает "Два".

3.3 Ветвление по типу и пользовательское ветвление

Оператор switch также поддерживает ветвление на основе типов переменных, известное как ветвление по типу. Кроме того, мы можем создавать более сложные пользовательские условия ветвления.

Пример ветвления по типу:

var i interface{} = 1

switch i.(type) {
case int:
    fmt.Println("i - целое число")
case float64:
    fmt.Println("i - float64")
default:
    fmt.Println("i - другой тип")
}

Можно написать пользовательские условия ветвления для выполнения более сложных условных суждений, когда это необходимо.


## 4 Практическое упражнение

В этом разделе мы углубим понимание и применение условных операторов в Golang через конкретные примеры. Через практические задачи программирования вы станете более опытными в использовании операторов `if` и `switch` для решения реальных проблем.
### Калькулятор оценок

Давайте напишем простой калькулятор оценок. Эта программа будет определять и выводить соответствующую оценку на основе балла, введенного пользователем. Критерии оценок следующие:

- A - за баллы 90 и выше
- B - за баллы от 80 до 89
- C - за баллы от 70 до 79
- D - за баллы от 60 до 69
- F - за баллы ниже 60

Мы можем использовать либо оператор `if`, либо оператор `switch` для реализации этой функциональности. Сначала давайте рассмотрим пример с использованием оператора `if`:
```go
package main

import (
	"fmt"
)

func main() {
	var score int
	fmt.Print("Пожалуйста, введите балл: ")
	fmt.Scan(&score)

	if score >= 90 {
		fmt.Println("Оценка: A")
	} else if score >= 80 {
		fmt.Println("Оценка: B")
	} else if score >= 70 {
		fmt.Println("Оценка: C")
	} else if score >= 60 {
		fmt.Println("Оценка: D")
	} else {
		fmt.Println("Оценка: F")
	}
}

В этом коде мы сначала объявляем переменную score для хранения введенного пользователем балла. Мы используем функцию fmt.Scan для получения ввода пользователя. Затем мы используем несколько операторов if и else if для определения соответствующей оценки по баллу и используем функцию fmt.Println для вывода оценки.

Далее давайте посмотрим пример с использованием оператора switch:

package main

import (
	"fmt"
)

func main() {
	var score int
	fmt.Print("Пожалуйста, введите балл: ")
	fmt.Scan(&score)

	switch {
	case score >= 90:
		fmt.Println("Оценка: A")
	case score >= 80:
		fmt.Println("Оценка: B")
	case score >= 70:
		fmt.Println("Оценка: C")
	case score >= 60:
		fmt.Println("Оценка: D")
	default:
		fmt.Println("Оценка: F")
	}
}

В примере с использованием оператора switch структура кода более лаконична и понятна. Нам не нужно использовать множество последовательных операторов if и else if; вместо этого мы непосредственно указываем условия в каждом case после switch. Балл, который не соответствует условию предыдущего case, автоматически переходит к следующему case, пока не соответствует соответствующей ветви условия или не достигнет default ветви, выводящей оценку F.

Теперь, когда вы узнали, как использовать операторы if и switch для условных суждений, попробуйте написать свою собственную программу и попрактикуйтесь, чтобы углубить свое понимание.

В следующем разделе мы продолжим представлять более практические задачи, чтобы помочь вам укрепить свое владение условными операторами в Golang.

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