首页 > 文章列表 > 如何获取输入并输出?

如何获取输入并输出?

345 2024-02-23
问题内容

我想要实现的是某种应用程序,它将大量信息记录到控制台(例如,从 0 到 1000000000000 的数字),并且能够通过在控制台中键入命令来停止执行(例如“停止”)。

我想到了使用 goroutine 的想法,但是,我无法输入命令,因为输入字段正在更改为输出。

这是我的代码:

package main

import (
    "bufio"
    "os"
)

var process bool = true

func commandHandler() {
    reader := bufio.NewReader(os.Stdin)
    for process {
        text, _ := reader.ReadString('n')
        if text == "stoprn" {
            process = false
        }
    }
}

func task() {
    var i int64 = 0
    for ; i < 10000000000 || process; i++ {
        if i%30000000 == 0 { // Just to slow down an output for a while
            println(i)
        }
    }
}

func main() {
    go task()
    commandHandler()
}

以及我得到的结果。字母是我尝试输入的输入,数字是应用程序的输出

关于如何在我的 go 应用程序中进行正确的输入/输出有什么建议吗?


正确答案


我无法输入命令,因为输入字段正在更改为输出

您可以正常输入命令。当您键入它们时,它们会回显到您的控制台。这将与输出到控制台的其他所有内容结合在一起,这可能会让用户感到困惑 - 但不会让计算机感到困惑。

假设这实际上与您的操作系统匹配,您的程序运行得很好:

if text == "stoprn" {

在我的操作系统上没有 r。更便携的方法是使用 strings.trimspace 删除所有空格。

import (
  ...
  "strings"
) 
... 
...
        if strings.TrimSpace(text) == "stop" {

通过此更改,代码对我有用。正如您所说,输出和输入被插入到屏幕上,但您仍然可以输入 stop 并结束程序。

关于如何在我的 go 应用程序中进行正确的输入/输出有什么建议吗?

现实世界中几乎没有终端程序是交互式的。相反,命令行参数和环境变量在调用时提供其配置。 shell 重定向通常用于保留(在文件中)或分页(例如 |less)程序的任何长输出。

您会看到很多使用交互式终端模型的学术编程,其中程序提示用户并收集数据,但在现实世界中这种情况非常罕见,并且通常是一种不明智的复杂化。标准输入通常用于提供计算所需的数据输入,而不是用户命令(例如要操作或过滤的数据)。

正如 @tinkerer 所建议的,信号已经可以用来终止你的程序(详细信息是特定于操作系统的)。因此,实际上无需担心终端应用程序如何处理标准输入和输出的可视化表示,而这些标准输入和输出的插值只是为了终止程序。在 posix 环境中还有许多其他信号,其中一些信号完全面向用户并且可以用于任意目的。

一旦运行时需要更复杂的用户输入,程序通常会在套接字上侦听命令。对于此类程序,由于简单性和可访问性,提供 http 服务的 web 界面变得越来越普遍。