Làm cách nào để truy cập các đối số dòng lệnh được truyền cho chương trình Go?


88

Làm cách nào để truy cập các đối số dòng lệnh trong Go? Chúng không được chuyển làm đối số main.

Một chương trình hoàn chỉnh, có thể được tạo bằng cách liên kết nhiều gói, phải có một gói được gọi là chính, với một chức năng

func main() { ... }

được xác định. Hàm main.main () không nhận đối số và không trả về giá trị.


Tôi sẽ xem xét flagmô-đun Golang tích hợp sẵn. Nó làm cho phân tích của os.Argsmột chút dễ dàng hơn
Matej

Ngoài ra, re: "không trả về giá trị", lưu ý rằng bạn có thể gọi os.Exit()để trả về một mã thoát cụ thể cho quá trình gọi.
Mark Reed

Câu trả lời:


113

Bạn có thể truy cập các đối số dòng lệnh bằng cách sử dụng os.Argsbiến. Ví dụ,

package main

import (
    "fmt"
    "os"
)

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

Bạn cũng có thể sử dụng gói cờ , gói này thực hiện phân tích cú pháp cờ dòng lệnh.


11

Các đối số dòng lệnh có thể được tìm thấy trong os.Args . Trong hầu hết các trường hợp, cờ gói tốt hơn vì nó thực hiện phân tích cú pháp đối số cho bạn.


9

Flag là một gói tốt cho điều đó.

// [_Command-line flags_](http://en.wikipedia.org/wiki/Command-line_interface#Command-line_option)
// are a common way to specify options for command-line
// programs. For example, in `wc -l` the `-l` is a
// command-line flag.

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())
}

1
Ngoại hình sao chép của Go bởi Ví dụ
Grijesh Chauhan

7

Câu trả lời của Peter là chính xác những gì bạn cần nếu bạn chỉ muốn một danh sách các lập luận.

Tuy nhiên, nếu bạn đang tìm kiếm chức năng tương tự như trình bày trên UNIX, sau đó bạn có thể sử dụng thực hiện đi của docopt . Bạn có thể thử nó ở đây .

docopt sẽ trả về JSON mà sau đó bạn có thể xử lý nội dung của trái tim mình.


1
Có thể nhu cầu là một từ quá mạnh. Đề xuất "sau đó bạn có thể".
Matt Joiner

7

Câu trả lời nhanh:

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)
}

Kiểm tra: $ go run test.go 1 2 3 4 5

Ngoài:

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

LƯU Ý : os.Argscung cấp quyền truy cập vào các đối số dòng lệnh thô. Lưu ý rằng giá trị đầu tiên trong phần này là đường dẫn đến chương trình và os.Args[1:]chứa các đối số của chương trình. Tài liệu tham khảo


0

bạn có thể sử dụng gói cờ Golang chẳng hạn,

package main

import (
    "flag"
    "fmt"
)

func main() {

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

}

gọi bằng cli

 go run main.go -word=hello
 
 

đầu ra

word: hello
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.