使用Golang編寫一個簡單的命令行工具
前言
每周四,在群里總是會看到一些瘋狂星期四的小故事,而且個個的小故事還挺有趣,但是讓我這樣的人肯定是編不出來了,在想剛好在學習Go,是不是可以怎么操作一下,寫個命令行來獲取周四文案啥的,這樣就不用自己去編了。既然有了想法那就開干
準備
源碼地址,結合看最好,下面代碼并不完全,大佬們有好的想法,歡迎issues,pr,也歡迎star,一起整活
- 了解使用Go寫命令行的庫
- 找一個生成瘋狂星期四文案的接口(后期也可以做自動生成)
- 通過特定的命令來調用這個接口并拿到這個文案
在這里我了解到一個用Go做命令行的流行庫cobra,據官方說這個被用在了很多大型項目,像Kubernetes, Hugo, GitHub CLI等等
找到的免費生成瘋狂星期四文案的接口https://api.jixs.cc/api/wenan-fkxqs/index.php
實現
首先量化需求,既然已接口的形式的話,其實無非就是調用接口,拿到返回值了,只是把這個步驟放在了用戶命令有對應操作之后執(zhí)行,明確需求了,就可以開始寫代碼了
1.使用Go調用這個API,拿到返回值并返回
package cmd
import (
"io"
"log"
"net/http"
)
// Fetch 發(fā)起請求
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做一個特定命令行
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)
}
}
這樣當我們執(zhí)行 go run main.go Thursday 后會在控制臺打印出獲取到的文案
但是我使用 GoLand 在這一步有點問題,就是當文案特別長的時候,他在控制臺還是會強行顯示一行,無法復制到全部,所以這時想起一種解決方法,那就是將文案存入一個txt文件中,這樣就可以啦。
3.生成文件夾,將結果存入
package cmd
import (
"fmt"
"log"
"os"
)
func Print(res string) {
// 創(chuàng)建文件
file, err := os.Create("./output/output.txt")
if err != nil {
fmt.Println("無法創(chuàng)建文件:", err)
return
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
log.Fatal(err)
}
}(file)
// 將內容寫入文件
_, err = file.WriteString(res)
if err != nil {
fmt.Println("無法寫入文件:", err)
return
}
fmt.Println("內容已成功寫入文件 output.txt")
}
到此基本上就完成了,算是一個練習的小demo吧,可以拿著這個去和群友歡樂對線吧!
效果

到此這篇關于使用Golang編寫一個簡單的命令行工具的文章就介紹到這了,更多相關Go命令行內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決Golang小數float64在實際工程中加減乘除的精度問題
這篇文章主要介紹了解決Golang小數float64在實際工程中加減乘除的精度問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

