@sait4seo

При подтверждении выхода через консоль, срабатывает прошлый Scan, как исправить?

Пишу консольное приложение Quiz (тест) в цикле вывожу вопросы и возможные варианты ответа, нужно реализовать фичу если пользователь попытается закрыть приложение с помощью Ctrl + C, необходимо запросить подтверждение. При подтверждении выхода через консоль, срабатывает прошлый Scan, который ждёт вариант ответа, т е . Really quit? [y/n] ввожу y - а он принимает это как ответ на прошлый Scan (в котором ожидался ответ на очередной вопрос теста). Само формирование вопросов опустил для компактности.

package main

import (
	"fmt"
	"strconv"
	//"bufio"
	"os"
	"syscall"
	"os/signal"
	//"runtime"
)

func main() {
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT) //os.Interrupt
go func() {
	for {
		select {
		case <-c:
			fmt.Printf("\nReally quit? [y/n] > ")
			var choice string
			fmt.Scan(&choice)

			if choice == "y" {
				os.Exit(0)
			}
		}
	}
}()
        fmt.Println("hello")
		
		var text string
		//k:
		for {
			fmt.Println("What ...?")  
			fmt.Scan(&text)//сканим ответ юзера
			inp, err := strconv.Atoi(text)
			if err != nil {
				fmt.Println(text, "Invalid number for exit!")
				//goto k
			} else {
				fmt.Println(inp)
				os.Exit(0)
			}
		}

}

Также пробовал читать через
var reader = bufio.NewReader(os.Stdin)
func myScan() string {   
    text, _ := reader.ReadString('\n')
    return text
}

Результат такой же
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ответы на вопрос 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
func readInput() string{
	//fmt.Scan()
	//process error
}
func main() {
	c := make(chan os.Signal, 1)
	signal.Notify(c, syscall.SIGINT) //os.Interrupt
	for {
		select {
		    case <-c:
			    choice:=readInput()
			    //process choice
		    default:
			    text:=readInput()
			    //process input text
		}
	}
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы