如何访问传递给Go程序的命令行参数?

huangapple go评论98阅读模式
英文:

How to access command-line arguments passed to a Go program?

问题

我如何在Go中访问命令行参数?它们不作为参数传递给main函数。

> 一个完整的程序,可能由多个包链接而成,必须有一个名为main的包,其中包含一个函数
>
> func main() { ... }
>
> 函数main.main()不接受任何参数,也不返回任何值。

英文:

How do I access command-line arguments in Go? They're not passed as arguments to main.

> A complete program, possibly created by linking multiple packages, must have one package called main, with a function
>
> func main() { ... }
>
> defined. The function main.main() takes no arguments and returns no value.

答案1

得分: 142

你可以使用os.Args变量来访问命令行参数。例如,

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println(len(os.Args), os.Args)
}

你也可以使用flag包,它实现了命令行标志解析。

英文:

You can access the command-line arguments using the os.Args variable. For example,

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Println(len(os.Args), os.Args)
}

You can also use the flag package, which implements command-line flag parsing.

答案2

得分: 22

Flag是一个很好的用于此目的的包。

package main

// Go提供了一个`flag`包,支持基本的命令行标志解析。我们将使用这个包来实现我们的示例命令行程序。
import "flag"
import "fmt"

func main() {

    // 可以为字符串、整数和布尔选项声明基本标志。在这里,我们声明一个带有默认值`"foo"`和简短描述的字符串标志`word`。这个`flag.String`函数返回一个字符串指针(而不是字符串值);我们将在下面看到如何使用这个指针。
    wordPtr := flag.String("word", "foo", "a string")

    // 这样声明`numb`和`fork`标志,使用与`word`标志类似的方法。
    numbPtr := flag.Int("numb", 42, "an int")
    boolPtr := flag.Bool("fork", false, "a bool")

    // 也可以声明一个使用程序中其他地方已声明的现有变量的选项。注意,我们需要传递一个指向标志声明函数的指针。
    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

    // 一旦所有标志都声明完毕,调用`flag.Parse()`来执行命令行解析。
    flag.Parse()

    // 在这里,我们只是打印出解析的选项和任何尾随的位置参数。注意,我们需要使用`*wordPtr`这样的方式来解引用指针,以获取实际的选项值。
    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}
英文:

Flag is a good package for that.

package main

// Go provides a `flag` package supporting basic
// command-line flag parsing. We'll use this package to
// implement our example command-line program.
import "flag"
import "fmt"

func main() {

    // Basic flag declarations are available for string,
    // integer, and boolean options. Here we declare a
    // string flag `word` with a default value `"foo"`
    // and a short description. This `flag.String` function
    // returns a string pointer (not a string value);
    // we'll see how to use this pointer below.
    wordPtr := flag.String("word", "foo", "a string")

    // This declares `numb` and `fork` flags, using a
    // similar approach to the `word` flag.
    numbPtr := flag.Int("numb", 42, "an int")
    boolPtr := flag.Bool("fork", false, "a bool")

    // It's also possible to declare an option that uses an
    // existing var declared elsewhere in the program.
    // Note that we need to pass in a pointer to the flag
    // declaration function.
    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

    // Once all flags are declared, call `flag.Parse()`
    // to execute the command-line parsing.
    flag.Parse()

    // Here we'll just dump out the parsed options and
    // any trailing positional arguments. Note that we
    // need to dereference the pointers with e.g. `*wordPtr`
    // to get the actual option values.
    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

答案3

得分: 16

快速答案:

package main

import (
	"fmt"
	"os"
)

func main() {
	argsWithProg := os.Args
	argsWithoutProg := os.Args[1:]
	arg := os.Args[3]
	fmt.Println(argsWithProg)
	fmt.Println(argsWithoutProg)
	fmt.Println(arg)
}

测试:$ go run test.go 1 2 3 4 5

输出:

[/tmp/go-build162373819/command-line-arguments/_obj/exe/modbus 1 2 3 4 5]
[1 2 3 4 5]
3

注意os.Args 提供对原始命令行参数的访问。请注意,此切片中的第一个值是程序的路径,os.Args[1:] 包含程序的参数。
参考

英文:

Quick Answer:

package main

import ("fmt"
	    "os"
)

func main() {
	argsWithProg := os.Args
	argsWithoutProg := os.Args[1:]
	arg := os.Args[3]
	fmt.Println(argsWithProg)
	fmt.Println(argsWithoutProg)
	fmt.Println(arg)
}

Test: $ go run test.go 1 2 3 4 5

Out:

[/tmp/go-build162373819/command-line-arguments/_obj/exe/modbus 1 2 3 4 5]
[1 2 3 4 5]
3

> NOTE: os.Args provides access to raw command-line arguments. Note that the first value in this slice is the path to the program,
> and os.Args[1:] holds the arguments to the program.
> Reference

答案4

得分: 11

命令行参数可以在os.Args中找到。但在大多数情况下,flag包更好,因为它会为您进行参数解析。

英文:

Command line arguments can be found in os.Args. In most cases though the package flag is better because it does the argument parsing for you.

答案5

得分: 8

Peter的回答正是你所需要的,如果你只想要一个参数列表。

然而,如果你正在寻找类似于UNIX上的功能,那么你可以使用docopt的go实现。你可以在这里尝试它。

docopt将返回JSON,你可以根据自己的需要进行处理。

英文:

Peter's answer is exactly what you need if you just want a list of arguments.

However, if you're looking for functionality similar to that present on UNIX, then you could use the go implementation of docopt. You can try it here.

docopt will return JSON that you can then process to your heart's content.

答案6

得分: 8

你可以使用Golang的flag包作为示例,

package main

import (
	"flag"
	"fmt"
)

func main() {

	wordPtr := flag.String("word", "默认值", "描述字符串")
	flag.Parse()
	fmt.Println("word:", *wordPtr)

}

通过命令行调用

 go run main.go -word=你好
 
 

输出

word: 你好
英文:

you can use the Golang flag package for example,

package main

import (
	"flag"
	"fmt"
)

func main() {

	wordPtr := flag.String("word", "default value", "a string for description")
	flag.Parse()
	fmt.Println("word:", *wordPtr)

}

call with cli

 go run main.go -word=hello
 
 

output

word: hello

huangapple
  • 本文由 发表于 2010年4月25日 14:55:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/2707434.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定