使用Golang編寫(xiě)一個(gè)簡(jiǎn)單的命令行工具
前言
每周四,在群里總是會(huì)看到一些瘋狂星期四的小故事,而且個(gè)個(gè)的小故事還挺有趣,但是讓我這樣的人肯定是編不出來(lái)了,在想剛好在學(xué)習(xí)Go,是不是可以怎么操作一下,寫(xiě)個(gè)命令行來(lái)獲取周四文案啥的,這樣就不用自己去編了。既然有了想法那就開(kāi)干
準(zhǔn)備
源碼地址,結(jié)合看最好,下面代碼并不完全,大佬們有好的想法,歡迎issues,pr,也歡迎star,一起整活
- 了解使用Go寫(xiě)命令行的庫(kù)
- 找一個(gè)生成瘋狂星期四文案的接口(后期也可以做自動(dòng)生成)
- 通過(guò)特定的命令來(lái)調(diào)用這個(gè)接口并拿到這個(gè)文案
在這里我了解到一個(gè)用Go做命令行的流行庫(kù)cobra,據(jù)官方說(shuō)這個(gè)被用在了很多大型項(xiàng)目,像Kubernetes, Hugo, GitHub CLI
等等
找到的免費(fèi)生成瘋狂星期四文案的接口https://api.jixs.cc/api/wenan-fkxqs/index.php
實(shí)現(xiàn)
首先量化需求,既然已接口的形式的話,其實(shí)無(wú)非就是調(diào)用接口,拿到返回值了,只是把這個(gè)步驟放在了用戶(hù)命令有對(duì)應(yīng)操作之后執(zhí)行,明確需求了,就可以開(kāi)始寫(xiě)代碼了
1.使用Go調(diào)用這個(gè)API,拿到返回值并返回
package cmd import ( "io" "log" "net/http" ) // Fetch 發(fā)起請(qǐng)求 func Fetch() string { client := &http.Client{} req, _ := http.NewRequest("GET", "https://api.jixs.cc/api/wenan-fkxqs/index.php", nil) res, err := client.Do(req) if err != nil { log.Fatal("Http get error is ", err) } if res.StatusCode != http.StatusOK { log.Fatal("Http status code is ", res.StatusCode) } defer func(Body io.ReadCloser) { err := Body.Close() if err != nil { log.Fatal(err) } }(res.Body) bytes, err := io.ReadAll(res.Body) if err != nil { return "" } return string(bytes) }
2.使用Cobra做一個(gè)特定命令行
package cmd import ( "fmt" "github.com/spf13/cobra" "os" ) var ThursdayCmd = &cobra.Command{ Use: "Thursday [文案]", Short: "crazy Thursday", Long: `crazy Thursday`, Run: func(cmd *cobra.Command, args []string) { res := Fetch() Print(res) fmt.Println(res) }, } var rootCmd = &cobra.Command{ Use: "ct", } func Execute() { rootCmd.AddCommand(ThursdayCmd) rootCmd.SetHelpCommand(ThursdayCmd) if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) } }
這樣當(dāng)我們執(zhí)行 go run main.go Thursday
后會(huì)在控制臺(tái)打印出獲取到的文案
但是我使用 GoLand 在這一步有點(diǎn)問(wèn)題,就是當(dāng)文案特別長(zhǎng)的時(shí)候,他在控制臺(tái)還是會(huì)強(qiáng)行顯示一行,無(wú)法復(fù)制到全部,所以這時(shí)想起一種解決方法,那就是將文案存入一個(gè)txt文件中,這樣就可以啦。
3.生成文件夾,將結(jié)果存入
package cmd import ( "fmt" "log" "os" ) func Print(res string) { // 創(chuàng)建文件 file, err := os.Create("./output/output.txt") if err != nil { fmt.Println("無(wú)法創(chuàng)建文件:", err) return } defer func(file *os.File) { err := file.Close() if err != nil { log.Fatal(err) } }(file) // 將內(nèi)容寫(xiě)入文件 _, err = file.WriteString(res) if err != nil { fmt.Println("無(wú)法寫(xiě)入文件:", err) return } fmt.Println("內(nèi)容已成功寫(xiě)入文件 output.txt") }
到此基本上就完成了,算是一個(gè)練習(xí)的小demo吧,可以拿著這個(gè)去和群友歡樂(lè)對(duì)線吧!
效果
到此這篇關(guān)于使用Golang編寫(xiě)一個(gè)簡(jiǎn)單的命令行工具的文章就介紹到這了,更多相關(guān)Go命令行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊Golang的語(yǔ)言結(jié)構(gòu)和變量問(wèn)題
這篇文章主要介紹了Golang的語(yǔ)言結(jié)構(gòu)和變量問(wèn)題,在golang中定義變量的一般形式是使用 var 關(guān)鍵字,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-11-11解決Golang小數(shù)float64在實(shí)際工程中加減乘除的精度問(wèn)題
這篇文章主要介紹了解決Golang小數(shù)float64在實(shí)際工程中加減乘除的精度問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03gRPC的發(fā)布訂閱模式及REST接口和超時(shí)控制
這篇文章主要為大家介紹了gRPC的發(fā)布訂閱模式及REST接口和超時(shí)控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Golang 如何判斷數(shù)組某個(gè)元素是否存在 (isset)
這篇文章主要介紹了Golang 如何判斷數(shù)組某個(gè)元素是否存在 (isset),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04詳解Go語(yǔ)言如何使用標(biāo)準(zhǔn)庫(kù)sort對(duì)切片進(jìn)行排序
Sort?標(biāo)準(zhǔn)庫(kù)提供了對(duì)基本數(shù)據(jù)類(lèi)型的切片和自定義類(lèi)型的切片進(jìn)行排序的函數(shù)。今天主要分享的內(nèi)容是使用?Go?標(biāo)準(zhǔn)庫(kù)?sort?對(duì)切片進(jìn)行排序,感興趣的可以了解一下2022-12-12