Функция с ошибкой в Go
Проверку аргумента прячут внутрь функции. Если значение не годится, функция возвращает ошибку, а вызывающий код решает, что показать.
Функция возвращает элемент среза по индексу только для неотрицательного индекса в пределах длины. Иначе - ошибка с текстом:
package main
import "errors"
func getAt(nums []int, index int) (int, error) {
if index < 0 {
return 0, errors.New("negative index")
}
if index >= len(nums) {
return 0, errors.New("bad index")
}
return nums[index], nil
}
func main() {
}
Вызов проверяют в main, чтобы отловить
и неверный аргумент, и выход за границы среза:
package main
import (
"errors"
"fmt"
)
func getAt(nums []int, index int) (int, error) {
if index < 0 {
return 0, errors.New("negative index")
}
if index >= len(nums) {
return 0, errors.New("bad index")
}
return nums[index], nil
}
func main() {
nums := []int{10, 20, 30}
val, err := getAt(nums, -1)
if err != nil {
fmt.Println("bad arg")
} else {
fmt.Println(val)
}
}
Та же схема работает для проверки диапазона
процента. Одна проверка err в месте
вызова задает реакцию на любой сбой функции:
package main
import (
"errors"
"fmt"
)
func percent(value int) error {
if value < 0 || value > 100 {
return errors.New("out of range")
}
fmt.Printf("%d%%\n", value)
return nil
}
func main() {
err := percent(150)
if err != nil {
fmt.Println("invalid percent")
}
}
Создайте функцию ensureNonNegative с
параметром n. Для n < 0
верните ошибку с сообщением "negative".
Иначе верните n и nil.
Создайте функцию divide с двумя
целыми параметрами. При b == 0
верните ошибку. Иначе верните частное.
В main вызовите ее с нулевым делителем,
проверьте err и выведите "fail"
при сбое.
Создайте функцию charAtSafe со строкой
и индексом. При отрицательном индексе или
если индекс не меньше длины строки, верните
ошибку. Иначе верните символ строки как
строку длины 1. Проверьте вызов
с большим индексом в main.