使用Golang編寫一個(gè)簡(jiǎn)單的命令行工具
前言
每周四,在群里總是會(huì)看到一些瘋狂星期四的小故事,而且個(gè)個(gè)的小故事還挺有趣,但是讓我這樣的人肯定是編不出來(lái)了,在想剛好在學(xué)習(xí)Go,是不是可以怎么操作一下,寫個(gè)命令行來(lái)獲取周四文案啥的,這樣就不用自己去編了。既然有了想法那就開(kāi)干
準(zhǔn)備
源碼地址,結(jié)合看最好,下面代碼并不完全,大佬們有好的想法,歡迎issues,pr,也歡迎star,一起整活
- 了解使用Go寫命令行的庫(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è)步驟放在了用戶命令有對(duì)應(yīng)操作之后執(zhí)行,明確需求了,就可以開(kāi)始寫代碼了
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)容寫入文件
_, err = file.WriteString(res)
if err != nil {
fmt.Println("無(wú)法寫入文件:", err)
return
}
fmt.Println("內(nèi)容已成功寫入文件 output.txt")
}
到此基本上就完成了,算是一個(gè)練習(xí)的小demo吧,可以拿著這個(gè)去和群友歡樂(lè)對(duì)線吧!
效果

到此這篇關(guān)于使用Golang編寫一個(gè)簡(jiǎn)單的命令行工具的文章就介紹到這了,更多相關(guān)Go命令行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go使用Pipeline實(shí)現(xiàn)一個(gè)簡(jiǎn)潔而高效的數(shù)據(jù)處理流水線
在并發(fā)編程中,流水線Pipeline是一種常見(jiàn)的設(shè)計(jì)模式,它將一個(gè)復(fù)雜任務(wù)拆解為多個(gè)獨(dú)立步驟,由多個(gè)協(xié)程并行處理并通過(guò)通道傳遞數(shù)據(jù),Go語(yǔ)言天生支持這種模型,能顯著提高數(shù)據(jù)處理的性能和可讀性,本文將給大家介紹如何使用Go實(shí)現(xiàn)一個(gè)簡(jiǎn)潔而高效的數(shù)據(jù)處理流水線2025-08-08
一文詳解下劃線字段在golang結(jié)構(gòu)體中的應(yīng)用
這篇文章主要為大家詳細(xì)介紹了下劃線字段在golang結(jié)構(gòu)體中應(yīng)用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-08-08
Golang?依賴注入經(jīng)典解決方案uber/fx理論解析
這篇文章主要為大家介紹了Golang依賴注入經(jīng)典解決方案uber/fx理論解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
如何組織Go代碼目錄結(jié)構(gòu)依賴注入wire使用解析
這篇文章主要為大家介紹了如何組織Go代碼目錄結(jié)構(gòu)依賴注入wire使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
go語(yǔ)言Pflag Viper Cobra 核心功能使用介紹
這篇文章主要為大家介紹了go語(yǔ)言Pflag Viper Cobra 核心功能使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
一文帶你入門Go語(yǔ)言中定時(shí)任務(wù)庫(kù)Cron的使用
在平時(shí)的開(kāi)發(fā)需求中,我們經(jīng)常會(huì)有一些重復(fù)執(zhí)行的操作需要觸發(fā)執(zhí)行,說(shuō)白了就是定時(shí)任務(wù)。這篇文章主要給大家介紹一下如何在go項(xiàng)目中實(shí)現(xiàn)一個(gè)crontab功能,感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助2022-08-08
golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本詳解
這篇文章主要給大家介紹了關(guān)于golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01

