Lors du développement d'utilitaires de ligne de commande, il est souvent nécessaire de faire la distinction entre les entrées provenant d'un autre programme ou entrées de manière interactive. Cet article explique comment vérifier si des données sont présentes sur STDIN dans Go.
Considérez le code suivant :
package main import ( "fmt" "io/ioutil" "os" ) func main() { bytes, _ := ioutil.ReadAll(os.Stdin) if len(bytes) > 0 { fmt.Println("Something on STDIN: " + string(bytes)) } else { fmt.Println("Nothing on STDIN") } }
Lorsqu'il est invoqué avec une entrée canalisée (par exemple, echo foo | go run test.go), ce code identifie correctement l'entrée. Cependant, s'il est appelé de manière interactive (sans entrée redirigée), le programme attend indéfiniment ioutil.ReadAll (os.Stdin).
Pour différencier les entrées redirigées et non redirigées, utilisez os .ModeCharDevice. Ce mode identifie si l'entrée provient d'un terminal ou non. Si cela ne provient pas d'un terminal, cela vient probablement d'un canal.
stat, _ := os.Stdin.Stat() if (stat.Mode() & os.ModeCharDevice) == 0 { fmt.Println("data is being piped to stdin") } else { fmt.Println("stdin is from a terminal") }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!