首頁 >後端開發 >Golang >在 Go 中如何偵測輸入是否透過管道傳送到 STDIN?

在 Go 中如何偵測輸入是否透過管道傳送到 STDIN?

Patricia Arquette
Patricia Arquette原創
2024-12-29 18:27:14969瀏覽

How Can I Detect if Input is Piped to STDIN in Go?

在Golang 中偵測STDIN 上的輸入

開發命令列實用程式時,通常需要區分從另一個程式透過管道傳輸的輸入或互動式輸入的輸入。本文介紹如何檢查 Go 中的 STDIN 上是否存在資料。

範例

考慮以下程式碼:

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")
    }
}

使用管道輸入呼叫時(例如, echo foo | go run test.go),此程式碼正確辨識輸入。但是,如果以互動方式呼叫(沒有管道輸入),程式將無限期地等待 ioutil.ReadAll(os.Stdin)。

解決方案

要區分管道輸入和非管道輸入,請使用 os .ModeCharDevice。此模式識別輸入是否來自終端。如果不是來自終端,則很可能是透過管道傳輸的。

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")
}

以上是在 Go 中如何偵測輸入是否透過管道傳送到 STDIN?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn