Возврат по условию в Go
Давайте теперь будем возвращать результат прямо из ветки, без лишней
переменной. Сначала запишем выбор большего числа через промежуточную
res:
package main
import "fmt"
func func(a, b int) int {
var res int
if a > b {
res = a
} else {
res = b
}
return res
}
func main() {
fmt.Println(func(3, 7)) // выведет 7
}
В зависимости от условия в res попадает либо одно значение,
либо другое, а последней строкой оно возвращается. Ту же функцию можно
записать короче:
package main
import "fmt"
func func(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
fmt.Println(func(3, 7)) // выведет 7
}
Тот же шаблон подходит для проверки четности. Нечетное число дает
0, четное делится пополам:
package main
import "fmt"
func func(n int) int {
if n%2 != 0 {
return 0
}
return n / 2
}
func main() {
fmt.Println(func(8)) // выведет 4
fmt.Println(func(5)) // выведет 0
}
Пусть функция func возвращает сумму чисел от 1 до
5. Команду return ставят после цикла:
package main
import "fmt"
func func() int {
sum := 0
for i := 1; i <= 5; i++ {
sum += i
}
return sum
}
func main() {
res := func()
fmt.Println(res) // выведет 15
}
Если поставить return внутри цикла, он прокрутится лишь одну
итерацию и функция сразу закончится. За один шаг в sum окажется
только 1, а не вся сумма. После цикла компилятору все равно
нужен возврат: он считает, что цикл мог не выполниться.
package main
import "fmt"
func func() int {
sum := 0
for i := 1; i <= 5; i++ {
sum += i
return sum
}
return 0
}
func main() {
res := func()
fmt.Println(res) // выведет 1
}
То, что return стоит внутри цикла, не всегда ошибка. Следующая
функция считает, сколько целых чисел, начиная с 1, нужно
сложить, чтобы сумма стала больше или равна 100:
package main
import "fmt"
func func() int {
sum := 0
i := 1
for { // цикл крутится, пока не выйдет return
sum += i
if sum >= 100 {
return i
}
i++
}
}
func main() {
fmt.Println(func()) // выведет 14
}
Что выведется на экран в результате выполнения следующего кода:
func func(num int) int {
sum := 0
for i := 1; i <= num; i++ {
sum += i
return sum
}
return 0
}
fmt.Println(func(5))
Объясните почему. Что хотел сделать автор данного кода? Исправьте ошибку автора.
Напишите функцию, которая параметром типа int будет принимать
число и делить его на 2 столько раз, пока результат не станет
меньше 10. Пусть функция возвращает количество итераций,
которое потребовалось для достижения результата.
Дана следующая функция:
func func(num1, num2 int) int {
var res int
if num1 > 0 && num2 > 0 {
res = num1 * num2
} else {
res = num1 - num2
}
return res
}
fmt.Println(func(3, 4))
Перепишите ее в сокращенной форме: возвращайте результат прямо из
веток, без переменной res.
Напишите функцию func с параметрами a и b, которая
по условию возвращает меньшее. Выведите результат для 2 и
9.
Напишите функцию func с параметром n: при n
меньше нуля верните -1, иначе верните 1. Проверьте на
0 и -4.