Просто удалите для l oop в функции принятия решения.
Всякий раз, когда ваша функция принятия решения работает, если значение не равно 0, она вызывает main, но l oop для этого вызова функции определения все еще выполняется. Таким образом, в следующий раз, когда передается 0, ничего не запускается для второго вызова решающей функции, поэтому он завершается. Обратите внимание, что l oop для первого вызова все еще выполняется (в этом вызове переданное значение соответствует тому, что было передано пользователем в первый раз), следовательно, ваш l oop никогда не завершается.
func decider(value int) {
switch value {
case 1:
fmt.Println("You Chose One, try again \n")
//break
main()
case 2:
fmt.Println("You Chose Two, try again \n")
//break
main()
case 3:
fmt.Println("You Chose Three, try again \n")
//break
main()
case 0:
fmt.Println("You Chose To Quit")
fmt.Println("Good Bye")
value = 0 // doesnt help...
}
}