Unix 如何使用管道在围棋中编写“cat”

Unix 如何使用管道在围棋中编写“cat”,unix,go,Unix,Go,我在下面有一个Unix工具cat的实现。它从os.Stdin读取大量字节到缓冲区,然后将这些字节写到os.Stdout。有没有办法跳过缓冲区,直接将Stdin管道传输到Stdout package main import "os" import "io" func main() { buf := make([]byte, 1024) var n int var err error for err != io.EOF { n, err = os

我在下面有一个Unix工具
cat
的实现。它从
os.Stdin
读取大量字节到缓冲区,然后将这些字节写到
os.Stdout
。有没有办法跳过缓冲区,直接将
Stdin
管道传输到
Stdout

package main

import "os"
import "io"

func main() {
    buf := make([]byte, 1024)

    var n int
    var err error
    for err != io.EOF {
        n, err = os.Stdin.Read(buf)

        if n > 0 {
            os.Stdout.Write(buf[0:n])
        }
    }
}
您可以使用
io.Copy()

例如:

package main

import (
    "os"
    "io"
    "log"
)

func main() {
    if _, err := io.Copy(os.Stdout, os.Stdin); err != nil {
        log.Fatal(err)
    }
}
比如说,

package main

import (
    "io"
    "os"
)

func main() {
    io.Copy(os.Stdout, os.Stdin)
}

我不知道Go,但是cat也可以从命令行和stdin读取文件……所以如果你正在实现,你也需要包括这个功能。@WoodrowDouglass谢谢,但我实际上并不是在为
cat
创建一个替代品,只是把stdin/Stdout作为练习。当然,io.Copy使用循环和缓冲区,与原始代码非常相似。@nos我想可以使用
syscall.Sendfile()
,但我认为这不是OP的重点。@nos@Staven实际上我更愿意避免复制到缓冲区中。如何使用
Sendfile()
?@Sam
Sendfile()
几乎就是一个瘦包装器后面的Linux
Sendfile()
系统调用;有关文档,请参阅
man sendfile
。除非您已经确认
Copy()
是一个瓶颈,否则您不应该为此烦恼。