当前位置: 首页 > 面试题库 >

检查在Golang的STDIN上是否有需要阅读的内容

万俟震博
2023-03-14
问题内容

如果某些字符串通过管道传递到其STDIN,则我需要一个命令行实用程序来表现不同。这是一些最小的示例:

package main // file test.go

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

如果test.go没有在STDIN上调用任何东西,那么事情就卡在了…

bytes, _ := ioutil.ReadAll(os.Stdin)

…等待EOF

我需要怎么做才能做到这一点?

提前致谢!


问题答案:

我通过使用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")
}


 类似资料:
  • 问题内容: 我正在尝试在Windows 7 64位和Python 3.4.3上异步读取stdin 我尝试这样做是受SO的启发: 但是,它会引发一个。 是否可以将类似文件的对象包装在类中以为其提供套接字的API?我已经单独询问了这个问题,但是如果解决方案很简单,请在此处回答。 假设我无法包装类似文件的对象以使其成为套接字,我尝试使用受此要旨启发的流: 这引起了在 请告知如何在Windows上阅读使用

  • 问题内容: 是否需要进行显式的if(log.isDebugEnabled()){…}检查? 我的意思是,我已经看到一些帖子提到log.debug(“something”)进行隐式调用,以查看调试模式日志记录是否已启用,然后再进行日志记录。我是否缺少某些东西,或者在使用此步骤之前有中间步骤要执行? 谢谢! 与 编辑:在上面写过:http : //java.sg/whether-to-do-a-isd

  • 问题内容: 我想知道,在关闭阅读器之后,是否需要关闭InputStream? 问题答案: 不,您不必。 由于Java中用于流的装饰器方法可以通过将新流或读取器附加到其他流上来构建新流或读取器,因此实现将自动对其进行处理。 如果查看其来源,则会看到: 因此,关闭操作实际上关闭了底层的流读取器。 编辑:我想确保关闭也可以在输入流上工作,请继续关注。 签入 在调用sd的close时调用。

  • 问题内容: 这是@Jimt在Go中编写的工作程序和控制器模式的一个很好的示例, ” 但是此代码也有一个问题:如果要在退出时删除工作通道,则会发生死锁。 如果您使用,下次控制器写入该命令将导致恐慌,因为go无法写入一个已关闭的通道。如果您使用某些互斥锁来保护它,则由于它不会从通道读取任何内容,并且将阻止写入,因此互斥锁将导致死锁。您还可以为频道提供更大的缓冲,以解决此问题,但这还不够。 因此,我认为

  • 问题内容: 我正在运行一个线程,每次运行它时,都应该检查是否有新行要读取,但是它陷入等待行的存在的状态,从而暂停了整个代码。 有没有一种方法可以更好地检查a中是否有待阅读的文本? 问题答案: 不,没有简单的方法可以做到这一点。 有一个电话,但仅适用于该电话,不适用于该电话。如果您确实希望确保不会阻止它,则必须自己使用并维护缓冲区来实现它。

  • 我有一个用lat/long表达的观点 我有一个以米表示的半径值。我需要检查另一个点,也用拉特/long表示,是否在圆内。 如果我在平面上,我可以简单地使用公式 正如这些答案所深刻解释的那样。 然而,根据纬度/经度的用法,我不能使用这个公式,因为行星是球形的。 如何计算从任何给定点到中心的距离以与半径进行比较?