欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

golang構(gòu)建CLI程序的方法

Go語(yǔ)言

創(chuàng)新互聯(lián)建站主要從事網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)老城,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792

Go(又稱(chēng)Golang)是Google開(kāi)發(fā)的一種靜態(tài)強(qiáng)類(lèi)型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言。

羅伯特·格瑞史莫(Robert Griesemer),羅勃·派克(Rob Pike)及肯·湯普遜(Ken Thompson)于2007年9月開(kāi)始設(shè)計(jì)Go,稍后Ian Lance Taylor、Russ Cox加入項(xiàng)目。Go是基于Inferno操作系統(tǒng)所開(kāi)發(fā)的。Go于2009年11月正式宣布推出,成為開(kāi)放源代碼項(xiàng)目,并在Linux及Mac OS X平臺(tái)上進(jìn)行了實(shí)現(xiàn),后來(lái)追加了Windows系統(tǒng)下的實(shí)現(xiàn)。在2016年,Go被軟件評(píng)價(jià)公司TIOBE 選為“TIOBE 2016 年最佳語(yǔ)言”。 目前,Go每半年發(fā)布一個(gè)二級(jí)版本(即從a.x升級(jí)到a.y)。

CLI

CLI是Command Line Interface的縮寫(xiě),即 命令行界面。CLI界面是所有 路由器、TM (Termination Multiplexer, 終端復(fù)用器)、CM(Cable Modem, 電纜調(diào)制解調(diào)器)等產(chǎn)品提供的界面,如 CISCO, LUCENT,Arris, 華為等。它是 路由器產(chǎn)品的標(biāo)準(zhǔn)。使用CLI具有使用要求低(只需要 串行口),容易使用,功能擴(kuò)充方便等優(yōu)點(diǎn),特別是當(dāng)有很多(如10臺(tái))臺(tái) 路由器設(shè)備需要配置的時(shí)候,可以通過(guò)COPY/PASTE功能很快完成所有路由器的配置。不需要通過(guò)IE一臺(tái)臺(tái)配置。

在這篇博文中,我們將用 Go 構(gòu)建一個(gè) CLI 應(yīng)用程序,我們暫且把它叫做 go-grab-xkcd. 該應(yīng)用程序從 XKCD 拉取漫畫(huà)并通過(guò)命令行參數(shù)為您提供各種操作選項(xiàng).

我們將僅使用 Go 標(biāo)準(zhǔn)庫(kù)構(gòu)建整個(gè)應(yīng)用程序而不使用外部依賴.

這個(gè)應(yīng)用程序的想法或許看起來(lái)有點(diǎn)秀逗,但目的是實(shí)踐用 Go 編寫(xiě)生產(chǎn)級(jí)別的 (某種) 代碼而不是想被 Google 收購(gòu).

最后還有一個(gè)額外獎(jiǎng)勵(lì)

讓我們先來(lái)運(yùn)行一下這個(gè)應(yīng)用程序,然后再進(jìn)行操作

$ go-grab-xkcd --help
Usage of go-grab-xkcd:
  -n int
        Comic number to fetch (default latest)
  -o string
        Print output in format: text/json (default "text")
  -s    Save image to current directory
  -t int
        Client timeout in seconds (default 30)
$ go-grab-xkcd -n 323
Title: Ballmer Peak
Comic No: 323
Date: 1-10-2007
Description: Apple uses automated schnapps IVs.
Image: https://imgs.xkcd.com/comics/ballmer_peak.png
$ go-grab-xkcd -n 323 -o json
{
  "title": "Ballmer Peak",
  "number": 323,
  "date": "1-10-2007",
  "description": "Apple uses automated schnapps IVs.",
  "image": "https://imgs.xkcd.com/comics/ballmer_peak.png"
}

你可以通過(guò)下載并運(yùn)行計(jì)算機(jī)上的應(yīng)用程序來(lái)嘗試其他選項(xiàng).

本教程結(jié)束后你將熟悉以下主題內(nèi)容:

接收命令行參數(shù)

JSON 和 Go 結(jié)構(gòu)體之間的相互轉(zhuǎn)換

進(jìn)行 API 調(diào)用

創(chuàng)建文件 (從網(wǎng)絡(luò)上下載并保存)

字符串操作

以下是項(xiàng)目結(jié)構(gòu)

$ tree go-grab-xkcd
go-grab-xkcd
├── client
│   └── xkcd.go
└── model
    └── comic.go
├── main.go
└── go.mod
go.mod - Go Modules file used in Go for package management
main.go - Main entrypoint of the application
comic.go - Go representation of the data as a struct and operations on it
xkcd.go - xkcd client for making HTTP calls to the API, parsing response and saving to disk

1: 初始化項(xiàng)目

創(chuàng)建一個(gè) go.mod 文件 -

$ go mod init

這將會(huì)有助于你進(jìn)行包管理 (思考 JS 中的 package.json 文件)。

2: xkcd API

xkcd 是令人稱(chēng)贊的,您不需要任何注冊(cè)或訪問(wèn)密鑰就可以使用它們的 API。 打開(kāi) xkcd API “文檔” 您將會(huì)發(fā)現(xiàn)有兩個(gè)端點(diǎn) -

http://xkcd.com/info.0.json - 獲取最新漫畫(huà)

http://xkcd.com/614/info.0.json - 通過(guò)漫畫(huà)編號(hào)獲取指定的漫畫(huà)

以下是這些端點(diǎn)的 JSON 響應(yīng) -

{
  "num": 2311,
  "month": "5",
  "day": "25",
  "year": "2020",
  "title": "Confidence Interval",
  "alt": "The worst part is that's the millisigma interval.",
  "img": "https://imgs.xkcd.com/comics/confidence_interval.png",
  "safe_title": "Confidence Interval",
  "link": "",
  "news": "",
  "transcript": ""
}

文章相關(guān) xkcd

2: 為漫畫(huà)創(chuàng)建模型

根據(jù)上述 JSON 響應(yīng),我們?cè)?model 包中的 comic.go 中創(chuàng)建一個(gè)叫做 ComicResponse 的 struct

type ComicResponse struct {
    Month      string `json:"month"`
    Num        int    `json:"num"`
    Link       string `json:"link"`
    Year       string `json:"year"`
    News       string `json:"news"`
    SafeTitle  string `json:"safe_title"`
    Transcript string `json:"transcript"`
    Alt        string `json:"alt"`
    Img        string `json:"img"`
    Title      string `json:"title"`
    Day        string `json:"day"`
}

您可以使用 JSON-to-Go 工具從 JSON 自動(dòng)生成結(jié)構(gòu)體.

順便創(chuàng)建另一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體將用于從我們的應(yīng)用程序輸出數(shù)據(jù).

type Comic struct {
    Title       string `json:"title"`
    Number      int    `json:"number"`
    Date        string `json:"date"`
    Description string `json:"description"`
    Image       string `json:"image"`
}

將以下兩種方法添加到 ComicResponse 結(jié)構(gòu)體

// FormattedDate 函數(shù)將格式化日期元素為一個(gè)字符串
func (cr ComicResponse) FormattedDate() string {
    return fmt.Sprintf("%s-%s-%s", cr.Day, cr.Month, cr.Year)
}
// Comic 函數(shù)將從 API 接收到的 ComicResponse 轉(zhuǎn)換為應(yīng)用程序的輸出格式, Comic 結(jié)構(gòu)體
func (cr ComicResponse) Comic() Comic {
    return Comic{
        Title:       cr.Title,
        Number:      cr.Num,
        Date:        cr.FormattedDate(),
        Description: cr.Alt,
        Image:       cr.Img,
    }
}

然后將以下兩種方法添加到 Comic 結(jié)構(gòu)體

// PrettyString 函數(shù)創(chuàng)建一個(gè)漂亮的 Comic 字符串并用于輸出
func (c Comic) PrettyString() string {
    p := fmt.Sprintf(
        "Title: %s\nComic No: %d\nDate: %s\nDescription: %s\nImage: %s\n",
        c.Title, c.Number, c.Date, c.Description, c.Image)
    return p
}
// JSON 函數(shù)將 Comic 結(jié)構(gòu)體轉(zhuǎn)換為 JSON, 我們將使用 JSON 字符串作為輸出內(nèi)容
func (c Comic) JSON() string {
    cJSON, err := json.Marshal(c)
    if err != nil {
        return ""
    }
    return string(cJSON)
}

3: 設(shè)置 xkcd 客戶端發(fā)起請(qǐng)求,解析響應(yīng)并保存到磁盤(pán)

在 client 包中創(chuàng)建 xkcd.go 文件.

首先定義一個(gè)叫做 ComicNumber 自定義類(lèi)型,數(shù)據(jù)類(lèi)型為 int

type ComicNumber int

定義常量

const (
    // xkcd 的 BaseURL
    BaseURL string = "https://xkcd.com"
    // DefaultClientTimeout 是取消請(qǐng)求之前要等待的時(shí)間
    DefaultClientTimeout time.Duration = 30 * time.Second
    // 根據(jù) xkcd API, LatestComic 是最新的漫畫(huà)編號(hào)
    LatestComic ComicNumber = 0
)

創(chuàng)建一個(gè)結(jié)構(gòu)體 XKCDClient, 它將用于向 API 發(fā)出請(qǐng)求.

// XKCDClient 是 XKCD 的客戶端結(jié)構(gòu)體
type XKCDClient struct {
    client  *http.Client
    baseURL string
}
// NewXKCDClient 創(chuàng)建一個(gè)新的 XKCDClient
func NewXKCDClient() *XKCDClient {
    return &XKCDClient{
        client: &http.Client{
            Timeout: DefaultClientTimeout,
        },
        baseURL: BaseURL,
    }
}

添加以下 4 種方法到 XKCDClient

SetTimeout()

// SetTimeout 重寫(xiě)了默認(rèn)的 ClientTimeout
func (hc *XKCDClient) SetTimeout(d time.Duration) {
    hc.client.Timeout = d
}

Fetch()

// Fetch 根據(jù)提供的漫畫(huà)編號(hào)檢索漫畫(huà)
func (hc *XKCDClient) Fetch(n ComicNumber, save bool) (model.Comic, error) {
    resp, err := hc.client.Get(hc.buildURL(n))
    if err != nil {
        return model.Comic{}, err
    }
    defer resp.Body.Close()
    var comicResp model.ComicResponse
    if err := json.NewDecoder(resp.Body).Decode(&comicResp); err != nil {
        return model.Comic{}, err
    }
    if save {
        if err := hc.SaveToDisk(comicResp.Img, "."); err != nil {
            fmt.Println("Failed to save image!")
        }
    }
    return comicResp.Comic(), nil
}

SaveToDisk()

// SaveToDisk 下載并保存漫畫(huà)到本地磁盤(pán)
func (hc *XKCDClient) SaveToDisk(url, savePath string) error {
    resp, err := http.Get(url)
    if err != nil {
        return err
    }
    defer resp.Body.Close()
    absSavePath, _ := filepath.Abs(savePath)
    filePath := fmt.Sprintf("%s/%s", absSavePath, path.Base(url))
    file, err := os.Create(filePath)
    if err != nil {
        return err
    }
    defer file.Close()
    _, err = io.Copy(file, resp.Body)
    if err != nil {
        return err
    }
    return nil
}

buildURL()

func (hc *XKCDClient) buildURL(n ComicNumber) string {
    var finalURL string
    if n == LatestComic {
        finalURL = fmt.Sprintf("%s/info.0.json", hc.baseURL)
    } else {
        finalURL = fmt.Sprintf("%s/%d/info.0.json", hc.baseURL, n)
    }
    return finalURL
}

4: 連接所有

在 main() 函數(shù)內(nèi)部我們鏈接了所有內(nèi)容

讀取命令行參數(shù)

實(shí)例化 XKCDClient

使用 XKCDClient 從 API 拉取數(shù)據(jù)

輸出

讀取命令行參數(shù)

comicNo := flag.Int(
    "n", int(client.LatestComic), "Comic number to fetch (default latest)",
)
clientTimeout := flag.Int64(
    "t", int64(client.DefaultClientTimeout.Seconds()), "Client timeout in seconds",
)
saveImage := flag.Bool(
    "s", false, "Save image to current directory",
)
outputType := flag.String(
    "o", "text", "Print output in format: text/json",
)

flag.Parse()

實(shí)例化 XKCDClient

xkcdClient := client.NewXKCDClient()
xkcdClient.SetTimeout(time.Duration(*clientTimeout) * time.Second)

使用 XKCDClient 從 API 拉取數(shù)據(jù)

comic, err := xkcdClient.Fetch(client.ComicNumber(*comicNo), *saveImage)
if err != nil {
    log.Println(err)
}

輸出

if *outputType == "json" {
    fmt.Println(comic.JSON())
} else {
    fmt.Println(comic.PrettyString())
}

程序運(yùn)行如下

$ go run main.go -n 323 -o json

或者將其構(gòu)建為你的筆記本電腦的二進(jìn)制可執(zhí)行文件并運(yùn)行它

$ go build .
$ ./go-grab-xkcd -n 323 -s -o json

可以在這個(gè) Github 倉(cāng)庫(kù)找到完整的源代碼 - go-grab-xkcd

額外獎(jiǎng)勵(lì)

通過(guò)使用這個(gè)簡(jiǎn)單的 shell 魔術(shù)工具可以依次下載多個(gè)漫畫(huà)

$ for i in {1..10}; do ./go-grab-xkcd -n $i -s; done;

上面的 shell 代碼簡(jiǎn)單地在 for 循環(huán)中調(diào)用 go-grab-xkcd 命令,由于 xkcd 使用序列整數(shù),因此將 i 值替換為漫畫(huà)編號(hào)作為漫畫(huà)編號(hào) / ID.

以上就是使用 Go 來(lái)構(gòu)建一個(gè) CLI 程序的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!

本文名稱(chēng):golang構(gòu)建CLI程序的方法
文章位置:http://chinadenli.net/article24/gisdje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)網(wǎng)站導(dǎo)航、企業(yè)建站、云服務(wù)器、全網(wǎng)營(yíng)銷(xiāo)推廣、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)