Golang: Альтернативная условная конструкция
В Go, кроме привычного if, есть ещё одна конструкция ветвления — switch. Она используется для выбора одного из нескольких возможных путей выполнения кода. На первый взгляд switch в Go похож на аналогичную конструкцию из других языков (например, C или Java), но его поведение отличается в важных деталях.
x := 10
switch x {
case 10:
fmt.Println("case 10")
default:
fmt.Println("default case")
}Вывод:
case 10В этом примере x сравнивается с каждым case. Как только находится совпадение, выполняется соответствующий блок, и switch завершается автоматически — писать break не нужно. Кроме того, default не обязан идти последним — он всегда выполняется в последнюю очередь, если не было совпадений.
Можно использовать switch без выражения. В этом случае он работает как if-else if, проверяя условия по порядку:
x := 10
switch {
case x < 0:
fmt.Println("negative")
case x == 0:
fmt.Println("zero")
case x > 0:
fmt.Println("positive")
}Вывод:
positiveТакой вариант удобен, когда нужно проверить набор условий, а не одно значение.
Ключевое слово fallthrough
В Go по умолчанию не происходит проваливания в следующий case, как это бывает в других языках. Но если вы хотите принудительно продолжить выполнение следующего блока, можно использовать fallthrough:
x := 10
switch {
case x == 10:
fmt.Println("equal 10 case")
fallthrough
case x < 20:
fmt.Println("less than 20 case")
}Вывод:
equal 10 case
less than 20 caseКлючевое слово fallthrough всегда выполняет следующий case, даже если его условие не подходит. Это может привести к неожиданному поведению, поэтому используется редко и осознанно.
Задание
Реализуйте функцию ModifySpaces(s, mode string) string, которая изменяет строку s в зависимости от переданного режима mode. Подробности в примере:
// когда передается mode "dash", нужно заменить все пробелы на дефисы "-"
ModifySpaces("hello world", "dash") // hello-world
// когда передается mode "underscore", нужно заменить все пробелы на нижние подчеркивания "_"
ModifySpaces("hello world", "underscore") // hello_world
// когда передается неизвестный или пустой mode, заменяем все пробелы на звездочки "*"
ModifySpaces("hello world", "unknown") // hello*world
ModifySpaces("hello world", "") // hello*worldДля замены символов в строке существует функция ReplaceAll(s, old, new string) string из пакета strings:
strings.ReplaceAll("hello world!", "world!", "buddy!") // hello buddy!
strings.ReplaceAll("one two three", " ", "_") // one_two_threeПолезное
Golang: Альтернативная условная конструкция
В Go, кроме привычного if, есть ещё одна конструкция ветвления — switch. Она используется для выбора одного из нескольких возможных путей выполнения кода. На первый взгляд switch в Go похож на аналогичную конструкцию из других языков (например, C или Java), но его поведение отличается в важных деталях.
x := 10
switch x {
case 10:
fmt.Println("case 10")
default:
fmt.Println("default case")
}Вывод:
case 10В этом примере x сравнивается с каждым case. Как только находится совпадение, выполняется соответствующий блок, и switch завершается автоматически — писать break не нужно. Кроме того, default не обязан идти последним — он всегда выполняется в последнюю очередь, если не было совпадений.
Можно использовать switch без выражения. В этом случае он работает как if-else if, проверяя условия по порядку:
x := 10
switch {
case x < 0:
fmt.Println("negative")
case x == 0:
fmt.Println("zero")
case x > 0:
fmt.Println("positive")
}Вывод:
positiveТакой вариант удобен, когда нужно проверить набор условий, а не одно значение.
Ключевое слово fallthrough
В Go по умолчанию не происходит проваливания в следующий case, как это бывает в других языках. Но если вы хотите принудительно продолжить выполнение следующего блока, можно использовать fallthrough:
x := 10
switch {
case x == 10:
fmt.Println("equal 10 case")
fallthrough
case x < 20:
fmt.Println("less than 20 case")
}Вывод:
equal 10 case
less than 20 caseКлючевое слово fallthrough всегда выполняет следующий case, даже если его условие не подходит. Это может привести к неожиданному поведению, поэтому используется редко и осознанно.
Задание
Реализуйте функцию ModifySpaces(s, mode string) string, которая изменяет строку s в зависимости от переданного режима mode. Подробности в примере:
// когда передается mode "dash", нужно заменить все пробелы на дефисы "-"
ModifySpaces("hello world", "dash") // hello-world
// когда передается mode "underscore", нужно заменить все пробелы на нижние подчеркивания "_"
ModifySpaces("hello world", "underscore") // hello_world
// когда передается неизвестный или пустой mode, заменяем все пробелы на звездочки "*"
ModifySpaces("hello world", "unknown") // hello*world
ModifySpaces("hello world", "") // hello*worldДля замены символов в строке существует функция ReplaceAll(s, old, new string) string из пакета strings:
strings.ReplaceAll("hello world!", "world!", "buddy!") // hello buddy!
strings.ReplaceAll("one two three", " ", "_") // one_two_threeПолезное
Ваше упражнение проверяется по этим тестам
package solution
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestModifySpaces(t *testing.T) {
a := assert.New(t)
a.Equal("-hello-world-", ModifySpaces(" hello world ", "dash"))
a.Equal("_how_r_u_doing_", ModifySpaces(" how r u doing ", "underscore"))
a.Equal("*great*", ModifySpaces(" great ", ""))
a.Equal("*nice*", ModifySpaces(" nice ", "unknown"))
}Решение учителя откроется через:
20:00
