Коллеги, добрый день!
Заранее извиняюсь, я тут совсем новенький.
Для обучения писал калькулятор, но когда начал обрабатывать ошибку ввода не корректных данных наткнулся на то, что все действия после взятия error связанные с ним отрабатывают несколько раз (равное количеству ошибок) (буквально фантомный цикл), не смог найти информацию почему так происходит и как это отключить. Подскажите, пожалуйста.
Код прилагаю:
(Выделил жирным моменты взятия error)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
package main import ( "fmt" //"errors" //"math" ) func main() { var x, y int64 var operant string flag := true for { fmt.Println("Введите X:") for { _, err := fmt.Scan(&x) if err != nil { fmt.Println("Введено не корректное значение") } else { err = nil break } } fmt.Println("Введите Y:") for { _, err := fmt.Scan(&y) if err != nil { fmt.Println("Введено не корректное значение") } else { break } } fmt.Println("Введите действие:") fmt.Scan(&operant) for flag { switch operant { case "+": answer := x + y fmt.Println("Ответ :", answer) flag = false case "-": answer := x - y fmt.Println("Ответ :", answer) flag = false case "*": answer := float32(x) * float32(y) fmt.Println("Ответ :", answer) flag = false case "/": answer := float32(x) / float32(y) fmt.Println("Ответ :", answer) flag = false default: fmt.Println("Введена некорректная операция, введите заново") fmt.Scan(&operant) } } } } |
Так же заметил что при первом прохождение Ответ не выводил в строках где было преобразование формата данных, но все исправилось само после добавление и удаление дополнительной строки вывода переменных.
Опять же непонятные события стороннего наблюдателя
@didikizi Вам нужно использовать отдельные переменные err для каждого вложенного цикла. Вот исправленный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
package main import ( "fmt" ) func main() { var x, y int64 var operant string flag := true for { fmt.Println("Введите X:") for { _, errX := fmt.Scan(&x) if errX != nil { fmt.Println("Введено не корректное значение") } else { break } } fmt.Println("Введите Y:") for { _, errY := fmt.Scan(&y) if errY != nil { fmt.Println("Введено не корректное значение") } else { break } } fmt.Println("Введите действие:") fmt.Scan(&operant) for flag { switch operant { case "+": answer := x + y fmt.Println("Ответ :", answer) flag = false case "-": answer := x - y fmt.Println("Ответ :", answer) flag = false case "*": answer := float32(x) * float32(y) fmt.Println("Ответ :", answer) flag = false case "/": answer := float32(x) / float32(y) fmt.Println("Ответ :", answer) flag = false default: fmt.Println("Введена некорректная операция, введите заново") fmt.Scan(&operant) } } } } |