千鋒教育-做有情懷、有良心、有品質的職業教育機構

        400-811-9990
        手機站
        千鋒教育

        千鋒學習站 | 隨時隨地免費學

        千鋒教育

        掃一掃進入千鋒手機站

        領取全套視頻
        千鋒教育

        關注千鋒學習站小程序
        隨時隨地免費學習課程

        上海
        • 北京
        • 鄭州
        • 武漢
        • 成都
        • 西安
        • 沈陽
        • 廣州
        • 南京
        • 深圳
        • 大連
        • 青島
        • 杭州
        • 重慶
        當前位置:哈爾濱千鋒IT培訓  >  技術干貨  >  從零開始使用Golang構建高質量的命令行應用程序

        從零開始使用Golang構建高質量的命令行應用程序

        來源:千鋒教育
        發布人:xqq
        時間:2023-12-27 04:38:48

        從零開始使用Golang構建高質量的命令行應用程序

        命令行應用程序是一個非常有用的工具,可以在終端中執行各種操作,如查看文件,運行腳本等等。在本文中,我們將介紹如何使用Golang構建高質量的命令行應用程序。

        技術準備

        在開始之前,我們需要安裝Golang并設置好環境變量。在命令行中輸入以下命令來檢查是否安裝成功:

        go version

        如果顯示了Golang的版本號,那么說明已經安裝成功。

        接下來,我們將使用以下兩個Golang庫來幫助構建命令行應用程序:

        1. Cobra:Cobra是一個用于創建命令行應用程序的庫。它提供了創建命令、子命令、標記和其他功能的API。

        2. Viper:Viper是一個用于處理配置文件和命令行標記的庫。它提供了多種格式的配置文件支持,例如JSON、YAML、TOML等。

        安裝這兩個庫非常簡單。在命令行中,使用以下命令安裝Cobra和Viper:

        go get -u github.com/spf13/cobra/cobrago get -u github.com/spf13/viper/viper

        接下來,我們將使用這兩個庫來構建一個簡單的命令行應用程序。

        創建項目

        在開始之前,我們需要創建一個新的Golang項目。在命令行中,輸入以下命令來創建一個名為“mycli”的新項目:

        mkdir myclicd mycligo mod init mycli

        在創建了項目之后,我們需要創建一個新的命令行應用程序。

        使用以下命令創建一個名為“mycmd”的新命令:

        cobra init --pkg-name mycmd

        這將創建一個名為“mycmd”的新目錄,并在其中創建一個名為“cmd”的新目錄。

        mycli/  ├── cmd/  │   └── mycmd/  │       ├── root.go  │       └── mycmd.go  ├── go.mod  └── main.go

        在“mycmd”目錄中,我們可以看到兩個文件:root.go和mycmd.go。

        root.go文件是應用程序的入口文件。它包含了一些初始化代碼,例如創建命令和添加標記。

        mycmd.go文件是我們要創建的命令文件。它將包含我們的業務邏輯和處理邏輯。

        創建命令

        在開始編寫代碼之前,我們需要先創建一個名為“hello”的新命令。

        使用以下命令在mycmd.go中創建一個名為“hello”的新命令:

        cobra add hello

        這將在mycmd目錄中創建一個名為“hello.go”的新文件,并將新命令添加到root.go中。

        mycli/  ├── cmd/  │   └── mycmd/  │       ├── root.go  │       ├── hello.go     // 新增的文件  │       └── mycmd.go  ├── go.mod  └── main.go

        在hello.go文件中,我們可以看到一個名為“helloCmd”的新結構體。這個結構體代表了我們的新命令。

        我們可以使用以下代碼為命令添加一些元數據:

        func init() {    helloCmd.PersistentFlags().String("name", "world", "A name to say hello to.")    rootCmd.AddCommand(helloCmd)}

        這里我們添加了一個名為“name”的標記,并設置了默認值為“world”。

        接下來,我們需要編寫一些代碼來處理我們的命令。

        處理命令

        在hello.go文件中,我們可以看到一個名為“runHello”的新函數。這個函數是我們的業務邏輯。

        下面是代碼實現:

        func runHello(cmd *cobra.Command, args string) {    name, _ := cmd.Flags().GetString("name")    fmt.Printf("Hello, %s!\n", name)}

        這個函數從標記中獲取名稱,并使用fmt包來打印“Hello,name!”的消息。

        在main.go文件中,我們可以看到一個名為“Execute”的函數。這個函數是應用程序的入口點。

        我們只需要在這個函數中添加以下代碼即可:

        if err := mycmd.Execute(); err != nil {    fmt.Println(err)    os.Exit(1)}

        這個代碼將執行應用程序,并處理任何錯誤?,F在,我們已經完成了一個簡單的命令行應用程序。

        完整代碼如下所示:

        mycmd/cmd/hello.go:

        package cmd

        import (

        "fmt"

        "github.com/spf13/cobra"

        )

        var helloCmd = &cobra.Command{

        Use: "hello",

        Short: "Say hello",

        Run: runHello,

        }

        func init() {    helloCmd.PersistentFlags().String("name", "world", "A name to say hello to.")    rootCmd.AddCommand(helloCmd)}
        func runHello(cmd *cobra.Command, args string) {    name, _ := cmd.Flags().GetString("name")    fmt.Printf("Hello, %s!\n", name)}

        mycmd/cmd/root.go:

        package cmdimport (    "fmt"    "os"    "github.com/spf13/cobra")var rootCmd = &cobra.Command{    Use:   "mycmd",    Short: "A brief description of your application",    Long: A longer description that spans multiple lines and likely contains examples and usage of using your application. For example: 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.,    Run: func(cmd *cobra.Command, args string) {        // Do Stuff Here        fmt.Println("Welcome to mycmd!")    },}func init() {    cobra.OnInitialize(initConfig)    rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.mycmd.yaml)")    rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")}func initConfig() {    if cfgFile != "" {        // Use config file from the flag.        viper.SetConfigFile(cfgFile)    } else {        // Find home directory.        home, err := homedir.Dir()        if err != nil {            fmt.Println(err)            os.Exit(1)        }        // Search config in home directory with name ".mycmd" (without extension).        viper.AddConfigPath(home)        viper.SetConfigName(".mycmd")    }    viper.AutomaticEnv()    // If a config file is found, read it in.    if err := viper.ReadInConfig(); err == nil {        fmt.Println("Using config file:", viper.ConfigFileUsed())    }}

        mycmd/main.go:

        package mainimport "mycli/cmd"func main() {    if err := cmd.Execute(); err != nil {        panic(err)    }}

        多格式配置文件支持

        在上面的代碼中,我們使用了硬編碼的標記來設置“name”屬性。但是,在實際應用程序中,我們通常會使用配置文件來設置標記。

        Viper庫支持多種格式的配置文件,例如JSON、YAML、TOML等。我們可以使用以下代碼來初始化Viper:

        func initConfig() {    if cfgFile != "" {        // Use config file from the flag.        viper.SetConfigFile(cfgFile)    } else {        // Find home directory.        home, err := homedir.Dir()        if err != nil {            fmt.Println(err)            os.Exit(1)        }        // Search config in home directory with name ".mycmd" (without extension).        viper.AddConfigPath(home)        viper.SetConfigName(".mycmd")    }    viper.AutomaticEnv()    // If a config file is found, read it in.    if err := viper.ReadInConfig(); err == nil {        fmt.Println("Using config file:", viper.ConfigFileUsed())    }}

        這個代碼將首先查找命令行標記中的配置文件,并在找到時使用它。否則,它將查找用戶主目錄中名為“mycmd”的文件。

        以下是我們可以使用的兩個示例配置文件:

        JSON:

        {  "hello": {    "name": "Gopher"  }}

        YAML:

        hello:  name: Gopher

        我們可以使用以下代碼在應用程序中讀取這些配置:

        name := viper.GetString("hello.name")

        結論

        在本文中,我們已經學習了如何使用Cobra和Viper構建高質量的命令行應用程序。我們了解了如何創建命令、添加標記、處理命令和處理配置文件。希望這些知識能夠幫助你快速構建出自己的命令行應用程序。

        聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。

        猜你喜歡LIKE

        如何為網絡安全做好逆向工程

        2023-12-27

        大數據時間下的網絡安全挑戰:如何應對日益增長的風險?

        2023-12-27

        暴力破解密碼真的那么可怕嗎?看看這些加密算法就知道了

        2023-12-27

        最新文章NEW

        網絡安全威脅分析與應對指南

        2023-12-27

        如何截獲和解密SSL流量?

        2023-12-27

        網絡安全事件響應與處置流程

        2023-12-27

        相關推薦HOT

        更多>>

        快速通道 更多>>

        最新開班信息 更多>>

        網友熱搜 更多>>

        主站蜘蛛池模板: 成人性生交大片免费看午夜a| 精品一区二区三区在线视频| 女人18毛片一级毛片在线| 亚洲国产成人精品久久| 男性玩尿眼玩法| 国产性生交xxxxx免费| a级毛片无码免费真人| 我和麻麻的混乱生活| 亚洲人成片在线观看| 水蜜桃无码视频在线观看| 国产v日韩v欧美v精品专区| 2021成人国产精品| 天天干视频在线| 久久久久久夜精品精品免费啦| 欧洲成人午夜精品无码区久久| 免费人成黄页在线观看视频国产| 色国产精品一区在线观看| 国产精品刺激好大好爽视频| 一区二区三区久久精品| 拔播拔播华人永久免费| 亚洲人成精品久久久久| 欧美肥臀bbwbbwbbw| 噜噜噜综合亚洲| 邱淑芬一家交换| 国产精品社区在线观看| 一级做a爱片就在线看| 推油少妇久久99久久99久久| 亚洲人成网亚洲欧洲无码| 欧美激情综合亚洲五月蜜桃| 午夜精品乱人伦小说区| 色噜噜狠狠色综合日日| 国产白丝在线观看| 99久久精品美女高潮喷水| 女性高爱潮视频| 久久99蜜桃精品久久久久小说| 日韩在线第三页| 亚洲欧洲国产精品久久| 波多野结衣上班族| 午夜a级理论片在线播放| 老司机67194精品线观看| 色屁屁www影院免费观看视频|