Golang如何通过命令行指定输入文件?

Golang如何通过命令行指定输入文件? 你好,我是一个完全的初学者。我想知道如何使用命令行输入一个文本文件?

就像在Python中,我可以在命令行中输入 python3 program.py < input-file.txt 来使用输入的文本文件运行程序,这在Go中是否也可以实现?

我尝试过使用bufio来获取一些输入,并且它确实有效,但我想知道,如果Go支持的话,我是否可以用我刚才描述的方式来实现。

先谢谢了!

5 回复

非常感谢!

更多关于Golang如何通过命令行指定输入文件?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢! smiley

是的,在 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

这两种方式都能实现从文件读取输入的功能。

回到顶部