Golang如何通过命令行指定输入文件?
Golang如何通过命令行指定输入文件? 你好,我是一个完全的初学者。我想知道如何使用命令行输入一个文本文件?
就像在Python中,我可以在命令行中输入 python3 program.py < input-file.txt 来使用输入的文本文件运行程序,这在Go中是否也可以实现?
我尝试过使用bufio来获取一些输入,并且它确实有效,但我想知道,如果Go支持的话,我是否可以用我刚才描述的方式来实现。
先谢谢了!
5 回复
谢谢! 
是的,在 Go 中可以从标准输入读取数据。
只需将 os.Stdin 作为缓冲区,用于任何接受缓冲区的函数。
func main() {
fmt.Println("hello world")
}
以下是一个示例。
$ cat stdin.go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
b := s.Bytes()
fmt.Println(string(b))
}
if err := s.Err(); err != nil {
fmt.Println(err)
}
}
$ cat stdin.file
This is data from a file.
.
$ go build stdin.go
$ ./stdin < stdin.file
This is from a file.
$ cat stdin.file | ./stdin
This is data from a file.
在Go中,你可以通过标准输入(stdin)来读取命令行重定向的文件内容,就像你在Python中做的那样。Go的os.Stdin可以接收通过管道或重定向传入的数据。
下面是一个简单的示例程序,它从标准输入读取内容并打印出来:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line := scanner.Text()
fmt.Println(line)
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "读取错误:", err)
}
}
编译并运行这个程序:
go build program.go
./program < input-file.txt
或者直接运行:
go run program.go < input-file.txt
这样,input-file.txt的内容就会通过标准输入传递给程序,bufio.Scanner会逐行读取并打印出来。
如果你需要处理更复杂的命令行参数,可以使用flag包:
package main
import (
"flag"
"fmt"
"io"
"os"
)
func main() {
filename := flag.String("f", "", "输入文件名")
flag.Parse()
var input io.Reader = os.Stdin
if *filename != "" {
file, err := os.Open(*filename)
if err != nil {
fmt.Fprintf(os.Stderr, "无法打开文件: %v\n", err)
os.Exit(1)
}
defer file.Close()
input = file
}
data, err := io.ReadAll(input)
if err != nil {
fmt.Fprintf(os.Stderr, "读取错误: %v\n", err)
os.Exit(1)
}
fmt.Print(string(data))
}
使用方式:
# 通过重定向
./program < input-file.txt
# 或通过-f参数指定文件
./program -f input-file.txt
这两种方式都能实现从文件读取输入的功能。

