7

So I have:

import (
    "bufio"
    "os"
)
//...
var reader = bufio.NewReader(os.Stdin)
str, err := reader.ReadString('\n')

But reader.ReadString('\n') is blocking execution. I would like to read input in a non blocking way. Is it possible to achieve non blocking buffered input from os.Stdin using bufio package or any other std lib package from Go?

1 Answer 1

13

In general there isn't a concept of non-blocking IO APIs in Go. You accomplish the same thing by using goroutines.

Here's an example on Play, stdin is simulated since play doesn't allow for it.

package main

import "fmt"
import "time"

func main() {
    ch := make(chan string)
    go func(ch chan string) {
        /* Uncomment this block to actually read from stdin
        reader := bufio.NewReader(os.Stdin)
        for {
            s, err := reader.ReadString('\n')
            if err != nil { // Maybe log non io.EOF errors, if you want
                close(ch)
                return
            }
            ch <- s
        }
        */
        // Simulating stdin
        ch <- "A line of text"
        close(ch)
    }(ch)

stdinloop:
    for {
        select {
        case stdin, ok := <-ch:
            if !ok {
                break stdinloop
            } else {
                fmt.Println("Read input from stdin:", stdin)
            }
        case <-time.After(1 * time.Second):
            // Do something when there is nothing read from stdin
        }
    }
    fmt.Println("Done, stdin must be closed")
}
Sign up to request clarification or add additional context in comments.

2 Comments

It's my first time using goroutines so it took me a while reading the docs to understand what you did. thanks.
but this will have that goroutine leak right because reader.ReadString('\n') blocks regardless. is there a way around that?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.