最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言命令行參數及cobra使用方法

 更新時間:2024年01月09日 09:23:48   作者:世界盡頭與你  
Cobra是關于golang的一個命令行解析庫,用它能夠快速創(chuàng)建功能強大的 cli應用程序和命令行工具,本文主要介紹了Go語言命令行參數及cobra使用方法,感興趣的可以了解一下

1.原生命令行參數

os 包以跨平臺的方式,提供了一些與操作系統交互的函數和變量。程序的命令行參數可從 os 包的 Args 變量獲取;os 包外部使用 os.Args 訪問該變量

os.Args 變量是一個字符串(string)的 切片(slice),os.Args 的第一個元素:os.Args[0],是命令本身的名字;其它的元素則是程序啟動時傳給它的參數

func main() {
	var s, sep string
	for i := 1; i < len(os.Args); i++ {
		s += sep + os.Args[i]
		sep = " "
	}
	fmt.Println(s)
}

執(zhí)行程序,會輸出所有參數,以空格做分割:

go run hello.go 1 2.1 nma

2.使用CIL框架Cobra

cobra

Cobra 應用程序將遵循以下組織結構:

? appName/
  ? cmd/
      add.go
      your.go
      commands.go
      here.go
    main.go

創(chuàng)建 rootCmd

Cobra 不需要任何特殊的構造函數。只需創(chuàng)建命令即可

package cmd

import (
	"fmt"
	"os"

	"github.com/spf13/cobra"
	"github.com/spf13/viper"
)

var (
	cfgFile     string // 配置文件路徑
	userLicense string // 許可證類型

	rootCmd = &cobra.Command{
		// 應用名稱
		Use: "cobra-cli",
		// 應用簡短描述
		Short: "A generator for Cobra based Applications",
		// 應用詳細描述
		Long: `Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
	}
)

// Execute 用于執(zhí)行根命令 rootCmd
func Execute() error {
	return rootCmd.Execute()
}

func init() {
	// 在執(zhí)行任何子命令之前調用 initConfig() 函數
	cobra.OnInitialize(initConfig)

	// 配置文件
	rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
	// 作者信息
	rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution")
	// 許可證信息
	rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project")
	// 使用Viper進行配置
	rootCmd.PersistentFlags().Bool("viper", true, "use Viper for configuration")
	// 將命令行標志綁定到 Viper 配置庫中的相應參數
	err := viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
	if err != nil {
		return
	}
	err2 := viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
	if err2 != nil {
		return
	}
	// 設置默認配置值
	viper.SetDefault("author", "NAME HERE <EMAIL ADDRESS>")
	viper.SetDefault("license", "apache")

	// 用于添加子命令
	rootCmd.AddCommand(addCmd)
	rootCmd.AddCommand(initCmd)
}

// 初始化應用程序的配置
func initConfig() {
	// 判斷是否指定了配置文件路徑,如果指定了,則將其設置為 Viper 配置文件
	if cfgFile != "" {
		viper.SetConfigFile(cfgFile)
	} else {
		// 如果沒有指定配置文件路徑,就根據用戶的主目錄動態(tài)生成配置文件路徑
		home, err := os.UserHomeDir()
		cobra.CheckErr(err)
		viper.AddConfigPath(home)
		viper.SetConfigType("yaml")
		viper.SetConfigName(".cobra")
	}

	// 用于自動讀取環(huán)境變量
	viper.AutomaticEnv()

	// 用于讀取配置文件。如果成功讀取,則輸出使用的配置文件路徑
	if err := viper.ReadInConfig(); err == nil {
		fmt.Println("Using config file:", viper.ConfigFileUsed())
	}
}

創(chuàng)建你的 main.go

main.go 文件通常非常裸露。它有一個目的:初始化 Cobra:

package go_test

import "go-test/cmd"

func main() {
	err := cmd.Execute()
	if err != nil {
		return
	}
}

創(chuàng)建其他命令

可以定義其他命令,并且通常每個命令都有自己的文件 在 cmd/ 目錄中。

例如:如果要創(chuàng)建版本命令,則需要創(chuàng)建 cmd/version.go 和 使用以下內容填充它:

package cmd

import (
	"fmt"

	"github.com/spf13/cobra"
)

// 將 versionCmd 命令添加到根命令 rootCmd 中
func init() {
	rootCmd.AddCommand(versionCmd)
}

var versionCmd = &cobra.Command{
	Use:   "version",
	Short: "Print the version number of Hugo",
	Long:  `All software has versions. This is Hugo's`,
	// 用于定義命令被執(zhí)行時的具體操作
	// 在本例中,當執(zhí)行 version 命令時,會打印出 “Hugo Static Site Generator v0.9 – HEAD” 版本信息
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("Hugo Static Site Generator v0.9 -- HEAD")
	},
}

結合上面的代碼,當用戶輸入 cobra-cli version 時,將會觸發(fā) versionCmd 命令的執(zhí)行,打印出應用程序的版本信息

子命令

命令可能具有子命令,而子命令又可能具有其他子命令

請考慮以下目錄結構:AddCommand

├── cmd
│   ├── root.go
│   └── sub1
│       ├── sub1.go
│       └── sub2
│           ├── leafA.go
│           ├── leafB.go
│           └── sub2.go
└── main.go

返回和處理錯誤

如果您希望向命令的調用方返回錯誤,可以使用RunE

package cmd

import (
  "fmt"

  "github.com/spf13/cobra"
)

func init() {
  rootCmd.AddCommand(tryCmd)
}

var tryCmd = &cobra.Command{
  Use:   "try",
  Short: "Try and possibly fail at something",
  RunE: func(cmd *cobra.Command, args []string) error {
    if err := someFunc(); err != nil {
	return err
    }
    return nil
  },
}

3.cobra使用標志

標志提供修飾符來控制操作命令的運行方式

1、持久性標志

標志可以是“持久性的”,這意味著此標志將可用于它所分配的命令以及該命令下的每個命令。為全局標志,將標志指定為根上的持久標志

持久性標記的定義通常包括全局性的配置參數,例如日志級別、配置文件路徑、全局選項等

rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")

2、本地標志

在本地分配標志,該標志僅適用于該特定命令

本地標記通常用于定義特定命令所需的選項和參數,例如某個命令的特定配置選項

localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")

3、使用 Config 綁定標志

可以使用 viper 綁定您的標志:

var author string

func init() {
  rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution")
  viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
}

使用 Viper 綁定命令行標志可使配置管理更加一致、靈活和可組合。然而,具體是否需要綁定命令行標志取決于你的應用程序需求和偏好,如果你認為手動處理命令行標志更適合你,也可以不使用 Viper 進行綁定

4、參數必須

默認情況下,標志是可選的,如果想設置某個參數是必要的,可以進行設置:

rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
rootCmd.MarkFlagRequired("region")

或者,對于持久性標志:

rootCmd.PersistentFlags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
rootCmd.MarkPersistentFlagRequired("region")

5、標記Groups

如果您有不同的標志必須一起提供(例如,如果他們提供標志,他們也必須提供標志),也可以強制進行設定:

rootCmd.Flags().StringVarP(&u, "username", "u", "", "Username (required if password is set)")
rootCmd.Flags().StringVarP(&pw, "password", "p", "", "Password (required if username is set)")
rootCmd.MarkFlagsRequiredTogether("username", "password")

還可以設置不同標記的互斥(也就是不能同時出現):

rootCmd.Flags().BoolVar(&ofJson, "json", false, "Output in JSON")
rootCmd.Flags().BoolVar(&ofYaml, "yaml", false, "Output in YAML")
rootCmd.MarkFlagsMutuallyExclusive("json", "yaml")

如果要要求組中至少有一個標志存在,也可以指定:

rootCmd.Flags().BoolVar(&ofJson, "json", false, "Output in JSON")
rootCmd.Flags().BoolVar(&ofYaml, "yaml", false, "Output in YAML")
rootCmd.MarkFlagsOneRequired("json", "yaml")
rootCmd.MarkFlagsMutuallyExclusive("json", "yaml")

4.Cobra位置參數和自定義參數

可以指定位置參數的驗證:

內置了以下驗證器:Args Command

參數數量:

  • NoArgs- 如果有任何位置參數,則報告錯誤。
  • ArbitraryArgs- 接受任意數量的參數。
  • MinimumNArgs(int)- 如果提供的位置參數少于 N 個,則報告錯誤。
  • MaximumNArgs(int)- 如果提供了超過 N 個位置參數,則報告錯誤。
  • ExactArgs(int)- 如果位置參數不完全是 N 個,則報告錯誤。
  • RangeArgs(min, max)- 如果參數數不在min和max之間,則報告錯誤

論據內容:

  • OnlyValidArgs- 如果字段中未指定任何位置參數,則報告錯誤

此外,還可以將現有檢查與任意其他檢查相結合,例如:

var cmd = &cobra.Command{
  Short: "hello",
  Args: cobra.MatchAll(cobra.ExactArgs(2), cobra.OnlyValidArgs),
  Run: func(cmd *cobra.Command, args []string) {
    fmt.Println("Hello, World!")
  },
}

可以設置任何滿足的自定義驗證器,例如:

var cmd = &cobra.Command{
  Short: "hello",
  Args: func(cmd *cobra.Command, args []string) error {
    if err := cobra.MinimumNArgs(1)(cmd, args); err != nil {
        return err
    }
    // 運行自定義驗證邏輯
    if myapp.IsValidColor(args[0]) {
      return nil
    }
    return fmt.Errorf("invalid color specified: %s", args[0])
  },
  Run: func(cmd *cobra.Command, args []string) {
    fmt.Println("Hello, World!")
  },
}

5.Cobra PreRun和PostRun鉤子

在 Cobra 庫中,命令的執(zhí)行過程被分為多個階段,并且 Cobra 提供了一些Hooks來允許開發(fā)者在這些階段插入自定義的行為

1、PersistentPreRun

在執(zhí)行任何命令之前調用 PersistentPreRun??梢允褂眠@個鉤子來進行全局的初始化操作或者檢查全局的配置參數

2、PreRun

在執(zhí)行該命令之前調用 PreRun??梢允褂眠@個鉤子來執(zhí)行一些與特定命令相關的操作或配置檢查

3、Run

當命令被執(zhí)行時,會調用 Run 函數來執(zhí)行實際的命令操作

4、PostRun

在執(zhí)行完該命令之后調用 PostRun。可以使用這個鉤子來執(zhí)行一些與特定命令相關的清理工作或后處理操作

5、PersistentPostRun

在執(zhí)行完任何命令之后調用 PersistentPostRun。可以使用這個鉤子來進行全局的清理工作或輸出全局概要信息

例如:

package main

import (
  "fmt"

  "github.com/spf13/cobra"
)

func main() {

  var rootCmd = &cobra.Command{
    Use:   "root [sub]",
    Short: "My root command",
    PersistentPreRun: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args)
    },
    PreRun: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside rootCmd PreRun with args: %v\n", args)
    },
    Run: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside rootCmd Run with args: %v\n", args)
    },
    PostRun: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside rootCmd PostRun with args: %v\n", args)
    },
    PersistentPostRun: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args)
    },
  }

  var subCmd = &cobra.Command{
    Use:   "sub [no options!]",
    Short: "My subcommand",
    PreRun: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside subCmd PreRun with args: %v\n", args)
    },
    Run: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside subCmd Run with args: %v\n", args)
    },
    PostRun: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside subCmd PostRun with args: %v\n", args)
    },
    PersistentPostRun: func(cmd *cobra.Command, args []string) {
      fmt.Printf("Inside subCmd PersistentPostRun with args: %v\n", args)
    },
  }

  rootCmd.AddCommand(subCmd)

  rootCmd.SetArgs([]string{""})
  rootCmd.Execute()
  fmt.Println()
  rootCmd.SetArgs([]string{"sub", "arg1", "arg2"})
  rootCmd.Execute()
}

輸出:

Inside rootCmd PersistentPreRun with args: []
Inside rootCmd PreRun with args: []
Inside rootCmd Run with args: []
Inside rootCmd PostRun with args: []
Inside rootCmd PersistentPostRun with args: []

Inside rootCmd PersistentPreRun with args: [arg1 arg2]
Inside subCmd PreRun with args: [arg1 arg2]
Inside subCmd Run with args: [arg1 arg2]
Inside subCmd PostRun with args: [arg1 arg2]
Inside subCmd PersistentPostRun with args: [arg1 arg2]

到此這篇關于Go語言命令行參數及cobra使用方法的文章就介紹到這了,更多相關Go語言命令行參數及cobra內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang操作Redis的實現示例

    Golang操作Redis的實現示例

    本文介紹了Redis作為高性能key-value數據庫的特性,包括數據持久化、豐富的數據結構、高并發(fā)性能、原子操作以及連接池管理,通過實例展示了使用Redis進行String、List和Hash操作,以及設置過期時間和連接池的管理,感興趣的可以了解一下
    2025-11-11
  • golang如何判斷文件是否存在

    golang如何判斷文件是否存在

    判斷一個文件是否存在是一個相當常見的需求,在golang中也有多種方案實現這一功能,下面就跟隨小編一起學習一下具體的實現方法吧
    2024-11-11
  • 談談對Golang IO讀寫的困惑

    談談對Golang IO讀寫的困惑

    這篇文章主要介紹了談談對Golang IO讀寫的困惑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 用golang如何替換某個文件中的字符串

    用golang如何替換某個文件中的字符串

    這篇文章主要介紹了用golang實現替換某個文件中的字符串操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go如何在HTTP請求中操作cookie教程詳解

    Go如何在HTTP請求中操作cookie教程詳解

    這篇文章主要為大家介紹了Go如何在HTTP請求中操作cookie教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • GoLang并發(fā)編程中條件變量sync.Cond的使用

    GoLang并發(fā)編程中條件變量sync.Cond的使用

    Go標準庫提供Cond原語的目的是,為等待/通知場景下的并發(fā)問題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2023-01-01
  • Go中Writer和Reader接口的使用入門

    Go中Writer和Reader接口的使用入門

    本文主要介紹了Go中Writer和Reader接口的使用入門,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Go語言中的內存布局詳解

    Go語言中的內存布局詳解

    這篇文章主要給大家介紹了Go語言中的內存布局,那么本文中將嘗試解釋Go如何在內存中構建結構體,以及結構體在字節(jié)和比特位方面是什么樣子。 有需要的朋友們可以參考借鑒,感興趣的朋友們下面來跟著小編一起學習學習吧。
    2016-11-11
  • Golang內存模型教科書級講解

    Golang內存模型教科書級講解

    go官方介紹go內存模型的時候說:探究在什么條件下,goroutine?在讀取一個變量的值的時,能夠看到其它?goroutine?對這個變量進行的寫的結果,Go內存模型規(guī)定了一些條件,在這些條件下,在一個goroutine中讀取變量返回的值能夠確保是另一個goroutine中對該變量寫入的值
    2023-03-03
  • Go語言排序算法:快速、可靠的排序解決方案

    Go語言排序算法:快速、可靠的排序解決方案

    Go語言提供了多種快速、可靠的排序算法,可以滿足不同場景下的排序需求,其中最常用的排序算法包括快速排序、歸并排序和堆排序,需要的朋友可以參考下
    2023-10-10

最新評論

黔南| 松原市| 杭州市| 临夏市| 高碑店市| 宜章县| 东阿县| 永丰县| 祁连县| 郴州市| 许昌市| 大城县| 剑川县| 新竹市| 抚顺县| 宁晋县| 远安县| 乌审旗| 台北市| 诸暨市| 元朗区| 边坝县| 密山市| 嘉义县| 尉犁县| 乌兰察布市| 德庆县| 牙克石市| 小金县| 定远县| 汕尾市| 怀宁县| 拉孜县| 霍林郭勒市| 罗平县| 巴彦淖尔市| 固阳县| 泊头市| 山丹县| 龙山县| 长垣县|