golang 每日一庫之 go-flags

go-flags 是一個用於處理命令行參數和標誌的 Go 庫,它提供了一種簡潔而靈活的方式來定義和解析命令行標誌(flags)和參數。這個庫對於需要處理命令行輸入的 Go 應用程序非常有用,特別是在構建 CLI(命令行工具)時。

1. 安裝 go-flags

首先,你需要安裝 go-flags 庫。在命令行中運行以下命令:

go get github.com/jessevdk/go-flags

這個命令會安裝 go-flags 庫。

2. 基本用法

go-flags 允許你定義標誌和位置參數,並且能夠自動生成幫助信息。最基本的使用方式是定義結構體,標誌將被映射到結構體字段上。

示例:定義標誌和解析命令行參數

package main

import (
"fmt"
"github.com/jessevdk/go-flags"
)

type Options struct {
 Name    string`short:"n" long:"name" description:"Your name" required:"true"`
 Age     int    `short:"a" long:"age" description:"Your age" required:"true"`
 Verbose bool   `short:"v" long:"verbose" description:"Enable verbose output"`
}

func main() {
var opts Options
 parser := flags.NewParser(&opts, flags.Default)

// 解析命令行參數
 _, err := parser.Parse()
if err != nil {
 fmt.Println(err)
return
 }

// 輸出解析後的結果
 fmt.Printf("Name: %s\n", opts.Name)
 fmt.Printf("Age: %d\n", opts.Age)
 fmt.Printf("Verbose: %t\n", opts.Verbose)
}

解釋:

3. 標誌標籤

go-flags 允許在結構體字段上使用標籤來定義命令行標誌。常用的標籤包括:

示例:使用標籤

package main

import (
"fmt"
"github.com/jessevdk/go-flags"
)

type Options struct {
 Port    int    `short:"p" long:"port" description:"Port to bind" default:"8080"`
 Host    string`short:"h" long:"host" description:"Host address" default:"localhost"`
 LogFile string`short:"l" long:"logfile" description:"Log file" default:"app.log"`
}

func main() {
var opts Options
 parser := flags.NewParser(&opts, flags.Default)

// 解析命令行參數
 _, err := parser.Parse()
if err != nil {
 fmt.Println(err)
return
 }

// 輸出解析後的結果
 fmt.Printf("Port: %d\n", opts.Port)
 fmt.Printf("Host: %s\n", opts.Host)
 fmt.Printf("LogFile: %s\n", opts.LogFile)
}

解釋:

4. 位置參數

除了命令行標誌外,go-flags 還可以處理位置參數。這些參數按順序解析,不需要標誌。

示例:使用位置參數

package main

import (
"fmt"
"github.com/jessevdk/go-flags"
)

type Options struct {
 Verbose bool   `short:"v" long:"verbose" description:"Enable verbose output"`
 Filename string`positional-arg-name:"filename" description:"File to process" required:"true"`
}

func main() {
var opts Options
 parser := flags.NewParser(&opts, flags.Default)

// 解析命令行參數
 _, err := parser.Parse()
if err != nil {
 fmt.Println(err)
return
 }

// 輸出解析後的結果
 fmt.Printf("Verbose: %t\n", opts.Verbose)
 fmt.Printf("Filename: %s\n", opts.Filename)
}

說明:

5. 幫助和用法信息

go-flags 會自動爲你生成幫助信息,你可以通過 --help 或 -h 來查看。例如:

$ go run main.go --help

示例輸出:

Usage:
  example [OPTIONS] FILENAME

Application Options:
  -v, --verbose              Enable verbose output
  -h, --host=localhost       Host address (default: localhost)
  -p, --port=8080            Port to bind (default: 8080)
  -l, --logfile=app.log      Log file (default: app.log)

Positional arguments:
  filename                  File to process

Help Options:
  -h, --help                 Show this help message

6. 環境變量支持

go-flags 還支持從環境變量中加載配置。你可以使用 env 標籤來指定環境變量。

示例:使用環境變量

package main

import (
"fmt"
"github.com/jessevdk/go-flags"
"os"
)

type Options struct {
 Host string`long:"host" description:"Host address" env:"HOST" default:"localhost"`
}

func main() {
// 設置環境變量
 os.Setenv("HOST""192.168.1.1")

var opts Options
 parser := flags.NewParser(&opts, flags.Default)

// 解析命令行參數
 _, err := parser.Parse()
if err != nil {
 fmt.Println(err)
return
 }

// 輸出解析後的結果
 fmt.Printf("Host: %s\n", opts.Host)
}

說明:

7. 錯誤處理和退出

go-flags 允許你處理解析錯誤,並提供了多種錯誤類型,例如 flag.ErrHelp,你可以根據需要進行自定義錯誤處理。

示例:錯誤處理

package main

import (
"fmt"
"github.com/jessevdk/go-flags"
)

type Options struct {
 Verbose bool`short:"v" long:"verbose" description:"Enable verbose output"`
}

func main() {
var opts Options
 parser := flags.NewParser(&opts, flags.Default)

// 解析命令行參數
 _, err := parser.Parse()
if err != nil {
if flags.WantHelp(err) {
// 當需要幫助信息時
 fmt.Println("Displaying help:")
 parser.WriteHelp(os.Stdout)
return
 }
 fmt.Println("Error parsing flags:", err)
return
 }

// 輸出解析後的結果
 fmt.Printf("Verbose: %t\n", opts.Verbose)
}

8. 總結

標題:golang 每日一庫之 go-flags
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/02/13/1739428693955.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/geszS05MGjHmtkq6YG8NcA