Как сделать проверку деления на 0 в языке Golang
Извините за глупый вопрос, я знаю что в языке Go нет исключений, но меня интересует как сделать такой код Go?
try {
const x = 0;
const y = 10;
if(x == 0 || y == 0){
throw new Error("Divide by zero error");
} else {
alert(y / x)
}
} catch (e){
alert(e.message);
}
Ответы (2 шт):
Не стоит паттерны Java один в один переносить на Go, но если вопрос стоит именно так - можно попробовать.
В Go есть механизм паники, похожий на исключения в Java, возникшую панику можно отловить и преобразовать в ошибку.
Для этого нужно блок кода из try{что-то полезное} оформить в виде возвращающей ошибку анонимной функции func() (err error) {что-то полезное}(), а затем эту ошибку обработать как захочется.
err := func() (err error) {
// это примерный аналог try
defer func() {
if r := recover(); r != nil {
err = r.(error)
}
}()
// место для полезного кода, я выделил его {}, но только чтобы более явно показать его границы
{
a := 1
b := 0
fmt.Printf("Сейчас выполним допустимую операцию %d \n", a+b)
fmt.Printf("Сейчас выполним недопустимую операцию %d \n", a/b)
fmt.Printf("И еще одну допустимую %d \n", a+b)
}
return
}()
// эта часть кода похожа на catch, если предыдущая функция вернула ненулевую ошибку, то ее можно как-то обработать
if err != nil {
fmt.Println(err)
}
https://play.golang.org/p/hX8nj7RbaBz
На выводе в консоль видно, что функция успешно выполнила первую корректную операцию и сразу закончила работу после второй (некорректной) не дойдя до третьей. Появившаяся при этом паника могла закончить работу всего приложения, если бы не была обработана функцией recover.
В таком виде это больше похоже на трюк, а не рабочий код. Если что то может упасть или сработать неправильно - лучше просто оформить это в виде обычной функции, возвращающей ошибку.
Golang не имеет механизмов исключений и, соответственно, try..catch, но имеет механизм паники, как уже сказал @Mark
Для обработки ошибок в Golang присутствует тип error. Вам необходимо будет проверять значение на 0 и, если оно таковое, возвращать эту ошибку и обрабатывать ее:
package main
import (
"fmt"
"errors"
)
var (
// Используя тот самый механизм ошибок создаем нашу ошибку
divError = errors.New("Divide by zero error")
)
func main() {
// Отработает корректно и мы получим в ответе 5
// в err будет пустота - nil
intRes, err := intdiv(10, 2)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(intRes)
}
// В intRes у нас будет 0, а вот в err будет лежать ранее созданная ошибка
intRes, err = intdiv(10, 0)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(intRes)
}
}
// Специфика Golang такова, что мы можем либо получить interface{} как любой тип (но тогда нам придется обрабатывать тип переменных в самой функции и после получения результата), либо указывать тип
func intdiv(a int, b int) (int, error) {
if b == 0 {
return 0, divideError
}
return a / b, nil
}