【问题标题】:Why operate normally when bufio.NewWriter get os.Stdin in local为什么bufio.NewWriter在本地获取os.Stdin时运行正常
【发布时间】:2022-10-24 20:45:23
【问题描述】:
package main

import (
    "bufio"
    "os"
)

func main() {
    bw := bufio.NewWriter(os.Stdin)
    bw2 := bufio.NewWriter(os.Stdout)

    bw.WriteString("Hello, world 1\n")
    bw2.WriteString("Hello, world 2\n")

    bw.Flush()
    bw2.Flush()
}

此代码在本地环境中显示这两个字符串。 但是为什么它在不同的环境中工作方式不同呢?

我的本地环境 操作系统:macOS 12.6 去:去1.19.2达尔文/amd64 ide:vscode

  • 在我的本地机器上:
$ go run myworkspace/main/main.go
Hello, world 1
Hello, world 2
  • 在操场上:
# in the 'Output' section
---
Hello, world 2

Program exited.

【问题讨论】:

  • 嗨,关于 StackOverflow 指南的一般评论:粘贴文本在你的问题中,而不是屏幕截图(输出可以完美复制粘贴)

标签: go


【解决方案1】:

围棋游乐场
https://go.dev/play/p/PtoDwCZGggd

一直向下滚动到“关于游乐场”

关于游乐场

Go Playground 在沙箱中运行程序。

可以在 Playground 中运行的程序有一些限制:

游乐场程序与外界的唯一通信是写入标准输出和标准错误。

Go Playground 丢弃对标准输入的写入。


在本地,os.Stdin 是一个文件。

var (
    Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
    Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout")
    Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
)

Stdin、Stdout 和 Stderr 是指向标准输入、标准输出和标准错误文件描述符的打开文件。

【讨论】:

    【解决方案2】:

    底线是:您的程序无法控制启动时将用作 Stdin 和 Stdout 的东西。

    (另外:你应该检查你的代码中的错误)


    尝试在您的机器上运行:echo "" | go run main.go,或go run main.go < anyfile

    这是一个标准设置,当从终端运行命令时,shell 使用相同的文件描述符,指向读/写终端,用于 stdin 和 stdout/stderr。使用该设置,写入标准输入“有效”。

    但是您不能真正使用它(实际上,您不应该这样做),事实证明,操场并没有以这种方式开始其进程:

    package main
    
    import (
        "fmt"
        "os"
    )
    
    func main() {
        _, err := os.Stdin.Write([]byte("Hello
    "))
        if err != nil {
            fmt.Fprintln(os.Stderr, "*** error:", err)
        }
    }
    
    // Output:
    // *** error: write /dev/stdin: bad file descriptor
    //
    // Program exited.
    

    https://go.dev/play/p/NmxgOsK2ovp


    也可以看看 :

    Why is it possible to write() to STDIN?

    Writing to stdin and reading from stdout (UNIX/LINUX/C Programming)

    (通过谷歌搜索“写入标准输入”找到)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 2013-06-03
      • 2021-05-12
      相关资源
      最近更新 更多