日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

以下文章來源于一艘慢船 ,作者JayL

 

Go 編程:寫一個程序友好的命令行工具包

 

作為一名后端程序員,命令行程序太普遍了。如何開始一個類似的命令行程序的工具以及相關依賴包也非常多。個人最常使用的工具包是: spf13/cobra。 同時結合作者提供的spf13/viper包,命令行程序需要的絕大部分功能作者都替你想到了,基本上是沒有必要重寫一個新輪子了。

然而,即便是功能再齊全的包在個人使用的習慣與便利上還是因人而異的。雖然,通過cobra提供的命令行工具可以快速的啟動一個命令行項目的框架代碼,但是在多級命令的組織上,還可以在簡潔一點,特別是對于子命令的操作,添加一個子命令必須指定對應的父級命令,邏輯上正確,但是使用上是不便的。

rootCmd.AddCommand(subCmd)
...
subCmd.AddCommand(subSubCmd)

cobra生成的代碼中,不難發現類似以上的代碼。在多級命令的組織上是非常機械。因為是生成代碼,不需要手動編輯代碼,所以這種不便很難直接感受到。但它提供的cobra工具是程序員友好的。

但是對于企業級命令行項目而言,不可能通過人工的方式通過cobra工具手動生成相應的命令行框架代碼。而是需要直接將命令行代碼集成的項目框架中去,所以就命令行相關代碼而言,我們需要更加程序友好的工具包。

一個理想的命令行工具包,我認為可以是這樣的:

整個包僅提供一個增加子命令的接口:Add, 通過option的方式,對具體命令行進行配置即可。特別是對于多級命令的設置上,我希望可以通過類似文件系統的目錄結構的形式來定義具體的子級命令。

/			根命令
/foo		一級命令
/foo/bar  	二級命令
...

在使用上,可以是這樣:

根命令行:

import (
"fmt"

"github.com/x-mod/cmd"
)

func main() {
	cmd.Add(
		cmd.Path("/"),
		cmd.Main(Main),
)
	cmd.Execute()
}

func Main(c *cmd.Command, args []string) error {
	fmt.Println("my root command running ...")
	return nil
}

多級命令行:

import (
"fmt"

"github.com/x-mod/cmd"
)

func main() {
	cmd.Add(
		cmd.Path("/foo/bar/v1"),
		cmd.Main(V1),
).PersistentFlags().StringP("parameter", "p", "test", "flags usage")
	cmd.Version("version string")
	cmd.Execute()
}

func V1(c *cmd.Command, args []string) error {
	fmt.Println("V1 called")
	return nil
}

在Bash中,命令行操作如下:

$: go run main.go foo bar v1
V1 called

當然,現實中我也是這么做的。具體工具包的實現,請參考: x-mod/cmd。有了這樣一個程序友好的命令行工具包,下一步就是寫一個項目框架的快速啟動工具,將這個包用進去了。

分享到:
標簽:編程
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定