mauvm
mauvm

Reputation: 3646

Determine if Stdin has data with Go

Is there a way to check if the input stream (os.Stdin) has data?

The post Read from initial stdin in GO? shows how to read the data, but unfortunately blocks if no data is piped into the stdin.

Upvotes: 11

Views: 5927

Answers (2)

PetrD
PetrD

Reputation: 89

This seems to be reliable solution and works even with sleep/delayed data via pipe. https://coderwall.com/p/zyxyeg/golang-having-fun-with-os-stdin-and-shell-pipes

package main

import (
  "os"
  "fmt"
)

func main() {
  fi, err := os.Stdin.Stat()
  if err != nil {
    panic(err)
  }
  if fi.Mode() & os.ModeNamedPipe == 0 {
    fmt.Println("no pipe :(")
  } else {
    fmt.Println("hi pipe!")
  }
}

Upvotes: 8

Kluyg
Kluyg

Reputation: 5347

os.Stdin is like any other "file", so you can check it's size:

package main

import (
    "fmt"
    "os"
)

func main() {
    file := os.Stdin
    fi, err := file.Stat()
    if err != nil {
        fmt.Println("file.Stat()", err)
    }
    size := fi.Size()
    if size > 0 {
        fmt.Printf("%v bytes available in Stdin\n", size)
    } else {
        fmt.Println("Stdin is empty")
    }
}

I built this as a "pipe" executable, here is how it works:

$ ./pipe
Stdin is empty
$ echo test | ./pipe
5 bytes available in Stdin

Upvotes: 15

Related Questions