婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解Go 創建命令行工具的方法

詳解Go 創建命令行工具的方法

熱門標簽:杭州人工智能電銷機器人費用 赤峰電銷 谷歌美發店地圖標注 利用地圖標注位置 地圖區域圖標注后導出 官渡電銷外呼管理系統怎么收費 400開頭電話怎樣申請 江蘇呼叫中心外呼系統有效果嗎 貴州電話智能外呼系統

前言

最近因為項目需要寫了一段時間的 Go ,相對于 Java 來說語法簡單同時又有著一些 Python 之類的語法糖,讓人大呼”真香“。

但現階段相對來說還是 Python 寫的多一些,偶爾還得回爐寫點 Java ;自然對 Go 也談不上多熟悉。

于是便利用周末時間自己做個小項目來加深一些使用經驗。于是我便想到了之前利用 Java 寫的一個博客小工具。

那段時間正值微博圖床大量圖片禁止外鏈,導致許多個人博客中的圖片都不能查看。這個工具可以將文章中的圖片備份到本地,還能將圖片直接替換到其他圖床。

我個人現在是一直在使用,通常是在碼字的時候利用 iPic 之類的工具將圖片上傳到微博圖床(主要是方便+免費)。寫完之后再通過這個工具一鍵切換到 [SM.MS](http://sm.MS) 這類付費圖床,同時也會將圖片備份到本地磁盤。

改為用 Go 重寫為 cli 工具后使用效果如下:

3-min.gif

需要掌握哪些技能

之所以選擇這個工具用 Go 來重寫;一個是功能比較簡單,但也正好可以利用到 Go 的一些特點,比如網絡 IO、協程同步之類。

同時修改為命令行工具后是不是感覺更極客了呢。

再開始之前還是先為不熟悉 GoJavaer 介紹下大概會用到哪些知識點:

  • 使用和管理第三方依賴包(go mod)
  • 協程的運用。
  • 多平臺打包。

下面開始具體操作,我覺得即便是沒怎么接觸過 Go 的朋友看完之后也能快速上手實現一個小工具。

使用和管理第三方依賴

還沒有安裝 Go 的朋友請參考官網自行安裝。

首先介紹一下 Go 的依賴管理,在版本 1.11 之后官方就自帶了依賴管理模塊,所以在當下最新版 1.15 中已經強烈推薦使用。

它的目的和作用與 Java 中的 mavenPython 中的 pip 類似,但使用起來比 maven 簡單許多。

根據它的使用參考,需要首先在項目目錄下執行 go mod init 用于初始化一個 go.mod 文件,當然如果你使用的是 GoLang 這樣的 IDE,在新建項目時會自動幫我們創建好目錄結構,當然也包含 go.mod 這個文件。

在這個文件中我們引入我們需要的第三方包:

module btb
 
go 1.15
 
require (
 github.com/cheggaaa/pb/v3 v3.0.5
 github.com/fatih/color v1.10.0
 github.com/urfave/cli/v2 v2.3.0

我這里使用了三個包,分別是:

pb: progress bar,用于在控制臺輸出進度條。

color: 用于在控制臺輸出不同顏色的文本。

cli: 命令行工具開發包。

import (
 "btb/constants"
 "btb/service"
 "github.com/urfave/cli/v2"
 "log"
 "os"
)
 
func main() {
 var model string
 downloadPath := constants.DownloadPath
 markdownPath := constants.MarkdownPath
 
 app := cli.App{
 Flags: []cli.Flag{
 cli.StringFlag{
 Name:  "model",
 Usage:  "operating mode; r:replace, b:backup",
 DefaultText: "b",
 Aliases:  []string{"m"},
 Required: true,
 Destination: model,
 },
 cli.StringFlag{
 Name:  "download-path",
 Usage:  "The path where the image is stored",
 Aliases:  []string{"dp"},
 Destination: downloadPath,
 Required: true,
 Value:  constants.DownloadPath,
 },
 cli.StringFlag{
 Name:  "markdown-path",
 Usage:  "The path where the markdown file is stored",
 Aliases:  []string{"mp"},
 Destination: markdownPath,
 Required: true,
 Value:  constants.MarkdownPath,
 },
 },
 Action: func(c *cli.Context) error {
 service.DownLoadPic(markdownPath, downloadPath)
 
 return nil
 },
 Name: "btb",
 Usage: "Help you backup and replace your blog's images",
 }
 
 err := app.Run(os.Args)
 if err != nil {
 log.Fatal(err)
 }
}

代碼非常簡單,無非就是使用了 cli 所提供的 api 創建了幾個命令,將用戶輸入的 -dp-mp 參數映射到 downloadPathmarkdownPath 變量中。

之后便利用這兩個數據掃描所有的圖片,以及將圖片下載到對應的目錄中。

更多使用指南可以直接參考官方文檔。

可以看到部分語法與 Java 完全不同,比如:

申明變量時類型是放在后邊,先定義變量名稱;方法參數類似。

類型推導,可以不指定變量類型(新版本的 Java 也支持)

方法支持同時返回多個值,這點非常好用。

公共、私用函數利用首字母大小寫來區分。

還有其他的就不一一列舉了。


協程

緊接著命令執行處調用了 service.DownLoadPic(markdownPath, downloadPath) 處理業務邏輯。

這里包含的文件掃描、圖片下載之類的代碼就不分析了;官方 SDK 寫的很清楚,也比較簡單。

重點看看 Go 里的 goroutime 也就是協程。

我這里使用的場景是每掃描到一個文件就利用一個協程去解析和下載圖片,從而可以提高整體的運行效率。

func DownLoadPic(markdownPath, downloadPath string) {
 wg := sync.WaitGroup{}
 allFile, err := util.GetAllFile(markdownPath)
 wg.Add(len(*allFile))
 
 if err != nil {
 log.Fatal("read file error")
 }
 
 for _, filePath := range *allFile {
 
 go func(filePath string) {
 allLine, err := util.ReadFileLine(filePath)
 if err != nil {
 log.Fatal(err)
 }
 availableImgs := util.MatchAvailableImg(allLine)
 bar := pb.ProgressBarTemplate(constants.PbTmpl).Start(len(*availableImgs))
 bar.Set("fileName", filePath).
 SetWidth(120)
 
 for _, url := range *availableImgs {
 if err != nil {
  log.Fatal(err)
 }
 err := util.DownloadFile(url, *genFullFileName(downloadPath, filePath, url))
 if err != nil {
  log.Fatal(err)
 }
 bar.Increment()
 
 }
 bar.Finish()
 wg.Done()
 
 }(filePath)
 }
 wg.Wait()
 color.Green("Successful handling of [%v] files.\n", len(*allFile))
 
 if err != nil {
 log.Fatal(err)
 }
}

就代碼使用層面看起來是不是要比 Java 簡潔許多,我們不用像 Java 那樣需要維護一個 executorService,也不需要考慮這個線程池的大小,一切都交給 Go 自己去調度。

使用時只需要在調用函數之前加上 go 關鍵字,只不過這里是一個匿名函數。

而且由于 goroutime 非常輕量,與 Java 中的 thread 相比占用非常少的內存,所以我們也不需要精準的控制創建數量。


不過這里也用到了一個和 Java 非常類似的東西:WaitGroup

它的用法與作用都與 Java 中的 CountDownLatch 非常相似;主要用于等待所有的 goroutime 執行完畢,在這里自然是等待所有的圖片都下載完畢然后退出程序。

使用起來主要分為三步:

創建和初始化 goruntime 的數量:wg.Add(len(number)

每當一個 goruntime 執行完畢調用 wg.Done() 讓計數減一。

最終調用 wg.Wait() 等待WaitGroup 的數量減為0。

對于協程 Go 推薦使用 chanel 來互相通信,這點今后有機會再討論。

打包

核心邏輯也就這么多,下面來講講打包與運行;這點和 Java 的區別就比較大了。

眾所周知,Java 有一句名言:write once run anywhere

這是因為有了 JVM 虛擬機,所以我們不管代碼最終運行于哪個平臺都只需要打出一個包;但 Go 沒有虛擬機它是怎么做到在個各平臺運行呢。

簡單來說 Go 可以針對不同平臺打包出不同的二進制文件,這個文件包含了所有運行所需要的依賴,甚至都不需要在目標平臺安裝 Go 環境。

雖說 Java 最終只需要打一個包,但也得在各個平臺安裝兼容的 Java 運行環境。

我在這里編寫了一個 Makefile 用于執行打包:make relea

# Binary name
BINARY=btb
GOBUILD=go build -ldflags "-s -w" -o ${BINARY}
GOCLEAN=go clean
RMTARGZ=rm -rf *.gz
VERSION=0.0.1
 
release:
 # Clean
 $(GOCLEAN)
 $(RMTARGZ)
 # Build for mac
 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(GOBUILD)
 tar czvf ${BINARY}-mac64-${VERSION}.tar.gz ./${BINARY}
 # Build for arm
 $(GOCLEAN)
 CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $(GOBUILD)
 tar czvf ${BINARY}-arm64-${VERSION}.tar.gz ./${BINARY}
 # Build for linux
 $(GOCLEAN)
 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD)
 tar czvf ${BINARY}-linux64-${VERSION}.tar.gz ./${BINARY}
 # Build for win
 $(GOCLEAN)
 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 $(GOBUILD).exe
 tar czvf ${BINARY}-win64-${VERSION}.tar.gz ./${BINARY}.exe
 $(GOCLEAN)

可以看到我們只需要在 go build 之前指定系統變量即可打出不同平臺的包,比如我們為 Linux 系統的 arm64 架構打包文件:

CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build main.go -o btb

便可以直接在目標平臺執行 ./btb  運行程序。

總結

本文所有代碼都已上傳 Github: https://github.com/crossoverJie/btb

感興趣的也可以直接運行安裝腳本體驗。

curl -fsSL https://raw.githubusercontent.com/crossoverJie/btb/master/install.sh | bash

目前這個版本只實現了圖片下載備份,后續會完善圖床替換及其他功能。


這段時間接觸 Go 之后給我的感觸頗深,對于年紀 25 歲的 Java 來說,Go 確實是后生可畏,更氣人的是還趕上了云原生這個浪潮,就更惹不起了。

一些以前看來不那么重要的小毛病也被重點放大,比如啟動慢、占用內存多、語法啰嗦等;不過我依然對這位賞飯吃的祖師爺保持期待,從新版本的 Java 可以看出也在積極改變,更不用說它還有無人撼動的龐大生態。

到此這篇關于詳解Go 創建命令行工具的方法的文章就介紹到這了,更多相關Go 命令行工具內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MongoDB使用自帶的命令行工具進行備份和恢復的教程
  • 使用Django啟動命令行及執行腳本的方法
  • Go語言中使用flag包對命令行進行參數解析的方法
  • go語言執行windows下命令行的方法
  • Go語言命令行操作命令詳細介紹
  • 一文秒懂Go 編寫命令行工具的代碼

標簽:松原 黔西 鷹潭 保定 武漢 泰安 宜春 河池

巨人網絡通訊聲明:本文標題《詳解Go 創建命令行工具的方法》,本文關鍵詞  詳解,創建,命令行,工具,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解Go 創建命令行工具的方法》相關的同類信息!
  • 本頁收集關于詳解Go 創建命令行工具的方法的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色狠狠av一区二区三区| 精品污污网站免费看| 午夜精品福利一区二区蜜股av| 亚洲精品写真福利| 国产一区不卡在线| 欧美日韩五月天| 亚洲一二三四在线观看| 欧美中文字幕亚洲一区二区va在线 | 成人h动漫精品一区二| 不卡的av电影| 国产欧美日韩三区| 久久99精品久久只有精品| 欧美日韩一区二区在线观看视频| 国产精品另类一区| 国产凹凸在线观看一区二区| 日韩你懂的在线观看| 亚洲高清久久久| 久久国产欧美日韩精品| 日韩欧美一区在线| 国产精品一区二区久久精品爱涩| 久久新电视剧免费观看| 国产精品456露脸| 欧美精彩视频一区二区三区| 国产一区二区三区四区五区美女| 国产精品视频看| 欧美一区二区三区视频免费播放| 国产麻豆午夜三级精品| 亚洲大片精品永久免费| 一区二区三区在线看| 99久久伊人精品| 精品伊人久久久久7777人| 日韩精品资源二区在线| 另类小说视频一区二区| 国产精品麻豆网站| 欧美变态凌虐bdsm| 国产高清在线精品| 亚洲国产精品一区二区www| 久久女同性恋中文字幕| 国产电影一区在线| 国产女主播视频一区二区| 狠狠色综合播放一区二区| 欧美精品亚洲一区二区在线播放| 亚洲午夜精品久久久久久久久| 欧美日韩免费观看一区三区| 五月婷婷色综合| 精品国产sm最大网站免费看| 色综合网站在线| 国产成人h网站| 国产成人综合在线观看| 欧美美女视频在线观看| 丁香天五香天堂综合| 中文字幕在线视频一区| 欧美成人精精品一区二区频| 欧美精品一区二区三区四区| 日本高清免费不卡视频| 国产一区日韩二区欧美三区| 久久99这里只有精品| 日韩和欧美的一区| 亚洲欧洲精品成人久久奇米网| 亚洲免费大片在线观看| 欧美极品美女视频| 91一区二区三区在线播放| 青青草国产精品亚洲专区无| 综合久久久久综合| 日韩制服丝袜av| 国产乱理伦片在线观看夜一区| 免费xxxx性欧美18vr| 国产在线精品国自产拍免费| 久国产精品韩国三级视频| 青青草97国产精品免费观看无弹窗版| 一区二区三区四区中文字幕| 亚洲一区二区视频在线观看| 香蕉久久一区二区不卡无毒影院 | 欧美日韩一区二区在线视频| 97久久超碰国产精品| 欧美视频日韩视频| 久久精品视频免费观看| 色香蕉成人二区免费| 国产不卡高清在线观看视频| 在线免费观看不卡av| 欧美成人三级在线| 亚洲精品国产精品乱码不99| 首页国产欧美久久| 国产精品亚洲一区二区三区在线| 91蜜桃婷婷狠狠久久综合9色| 欧美精品一区二区在线观看| 国产欧美日韩另类一区| 国产美女在线观看一区| 五月天亚洲婷婷| 日本国产一区二区| 欧美精品一区二区三区很污很色的| 亚洲欧美日韩成人高清在线一区| 国产福利精品一区| 亚洲国产高清不卡| aaa亚洲精品| 亚洲精品v日韩精品| 在线观看欧美日本| 首页亚洲欧美制服丝腿| 91精品在线麻豆| 人人狠狠综合久久亚洲| xnxx国产精品| 欧美在线观看一区二区| 人妖欧美一区二区| 久久久久久99久久久精品网站| 日韩av二区在线播放| 欧美一卡二卡在线| 国产美女一区二区| 一区二区免费看| 欧美日韩国产免费一区二区 | 国产v日产∨综合v精品视频| 国产欧美一区二区精品仙草咪| 91丝袜国产在线播放| 精品在线免费观看| 国产精品国模大尺度视频| 777色狠狠一区二区三区| 国产在线不卡一卡二卡三卡四卡| 91精品国产欧美日韩| 成人永久aaa| 精品久久久久久久久久久久久久久久久| 久久精品国产亚洲高清剧情介绍| 91国产丝袜在线播放| 日韩高清不卡在线| 久久久一区二区三区捆绑**| 色噜噜夜夜夜综合网| 在线亚洲欧美专区二区| 成人美女视频在线看| 日韩极品在线观看| 亚洲成人你懂的| 亚洲欧美一区二区三区孕妇| 日韩美女视频一区| 中文字幕精品—区二区四季| ww久久中文字幕| 国产精品久久久久久久久免费相片| 2023国产精品| 中文久久乱码一区二区| 91在线国产福利| 欧美二区在线观看| 精品欧美一区二区在线观看| 国产人成一区二区三区影院| 中文字幕av免费专区久久| 一区精品在线播放| 亚洲午夜精品17c| 国产精品成人免费精品自在线观看| 久久色.com| 婷婷六月综合网| 国内精品久久久久影院薰衣草| 国产黄色成人av| 日韩三级视频在线观看| 日韩国产精品久久久| 亚洲国产视频网站| 一区二区在线观看免费| 中文字幕av一区 二区| 亚洲美女在线一区| 亚洲精品乱码久久久久久日本蜜臀| 精品国产精品网麻豆系列| 亚洲欧美一区二区不卡| 性欧美疯狂xxxxbbbb| 日本美女一区二区| 日韩电影一区二区三区四区| 麻豆国产精品官网| 色婷婷久久久综合中文字幕| 亚洲国产日韩综合久久精品| 亚洲永久精品大片| 午夜精品一区二区三区三上悠亚| 日韩成人精品在线观看| 色999日韩国产欧美一区二区| 久久亚洲精华国产精华液 | 色一区在线观看| 日日夜夜免费精品| 中文字幕一区二区三区四区| 精品一区二区国语对白| 欧美日韩精品欧美日韩精品| 国产日韩在线不卡| 国产在线精品国自产拍免费| 亚洲精品在线免费观看视频| 激情深爱一区二区| 精品国产精品一区二区夜夜嗨| 日本不卡1234视频| 欧美影院精品一区| 婷婷开心久久网| 欧美激情一区二区三区四区| 成人性生交大片免费看中文| 亚洲伦在线观看| 日韩欧美国产不卡| 99国产精品久久久久久久久久| 一区二区三区精品视频| 国产午夜精品福利| 欧美日韩国产中文| 91免费看视频| 国产白丝精品91爽爽久久| 午夜一区二区三区在线观看| 中文字幕欧美国产| 精品国产一区二区三区av性色| 欧美亚洲免费在线一区| 国内欧美视频一区二区| 五月天一区二区| 日日嗨av一区二区三区四区| 中文字幕视频一区二区三区久| 日韩一区二区三区电影在线观看| 成人精品国产一区二区4080|