Break out of input.Scan()

Typing a blank new line will not automatically stop the scanner.

If it ain't broke, don't fix it--but you can make it behave as you require. This doesn't get rid of your if block but functions as you expected scanner to, i.e. hitting enter with no input will stop the scanner:

    input := bufio.NewScanner(os.Stdin) //Creating a Scanner that will read the input from the console

    for input.Scan() {
        if input.Text() == "" {
            break
        } 
        fmt.Println(input.Text())
    }

I think you misread the documentation. The default scanner is ScanLines function.

Documentation says:

ScanLines is a split function for a Scanner that returns each line of text, stripped of any trailing end-of-line marker. The returned line may be empty. The end-of-line marker is one optional carriage return followed by one mandatory newline. In regular expression notation, it is \r?\n. The last non-empty line of input will be returned even if it has no newline.

Two important points here:

  • The return line may be empty: It means it returns empty lines.
  • The last non-empty line of input will be returned even if it has no newline: It means the last line of a file is always returned if it is non empty. It does not mean however an empty line end the stream.

The scanner will stop on EOF (End Of File). Typing Ctrl-D for example will send end of file and stop the scanner.


You are not misinterpreting the documentation.

It returns false when the scan stops, either by reaching the end of the input or an error.

What documentation states is correct. But you are missing that you need a way to provide end of the input i.e. EOF from the console.

In linux you can press "CTRL+D", which signals EOF from terminal.

Though there is a small catch here, that "CTRL+D" works only at the beginning of the line. Thus to terminate the input from terminal you need to go to a new line and press "CTRL+D" as first input on the line.


CTRL+D to break, if you want to input data easily, you can use cat input.txt | go run script.go or go run script.go < input.txt.

Tags:

Go