欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Go語言中讀取命令參數的幾種方法總結

Go語言中讀取命令參數的幾種方法總結

熱門標簽:鄭州亮點科技用的什么外呼系統 汕頭小型外呼系統 釘釘有地圖標注功能嗎 建造者2地圖標注 阿里云ai電話機器人 惠州電銷防封電話卡 浙江高頻外呼系統多少錢一個月 濱州自動電銷機器人排名 黃岡人工智能電銷機器人哪個好

前言

對于一名初學者來說,想要盡快熟悉 Go 語言特性,所以以操作式的學習方法為主,比如編寫一個簡單的數學計算器,讀取命令行參數,進行數學運算。

本文講述使用三種方式講述 Go 語言如何接受命令行參數,并完成一個簡單的數學計算,為演示方便,最后的命令行結果大概是這樣的:

# input 
./calc add 1 2
# output
3

# input
./calc sub 1 2
# out
-1

# input
./calc mul 10 20
# out
200

使用的三種方式是:

  • 內置 os 包讀取命令參數
  • 內置 flag 包讀取命令參數
  • cli 框架讀取命令參數

0. 已有歷史經驗

如果你熟悉 Python 、Shell 腳本,你可以比較下:

Python

import sys

args = sys.argv

# args 是一個列表
# 第一個值表示的是 文件名
# 除第一個之外,其他的值是接受的參數

Shell

if [ $# -ne 2 ]; then
 echo "Usage: $0 param1 pram2"
 exit 1
fi
name=$1
age=$2

echo $name
echo $age
# `$0` 表示文件名
# `$1` 表示第一個參數
# `$2` 表示第二個參數

能看出一些共性,接收參數,一般解析出來都是一個數組(列表、切片), 第一個元素表示的是文件名,剩余的參數表示接收的參數。

好,那么為了實現 “簡單數學計算” 這個功能,讀取命令行參數:比如 ./calc add 1 2

除文件名之外的第一個元素:解析為 進行數學運算的 操作,比如: add、sub、mul、sqrt
其余參數表示:進行操作的數值

注意:命令行讀取的參數一般為字符串,進行數值計算需要進行數據類型轉換

大概思路就是這樣。

1. OS 獲取命令行參數

os.Args

# 為接受的參數,是一個切片

strconv.Atoi 

# 將字符串數值轉換為整型

strconv.Itoa

# 將整型轉換為字符串

strconv.ParseFloat

# 將字符串數值轉換為浮點型
var help = func () {
 fmt.Println("Usage for calc tool.")
 fmt.Println("====================================================")
 fmt.Println("add 1 2, return 3")
 fmt.Println("sub 1 2, return -1")
 fmt.Println("mul 1 2, return 2")
 fmt.Println("sqrt 2, return 1.4142135623730951")
}


func CalcByOs() error {
 args := os.Args
 if len(args)  3 || args == nil {
 help()
 return nil
 }
 operate := args[1]
 switch operate {
 case "add":{
  rt := 0
  number_one, err1 := strconv.Atoi(args[2])
  number_two, err2 := strconv.Atoi(args[3])
  if err1 == nil  err2 == nil {
  rt = number_one + number_two
  fmt.Println("Result ", rt)
  }
 }
 case "sub":
 {
  rt := 0
  number_one, err1 := strconv.Atoi(args[2])
  number_two, err2 := strconv.Atoi(args[3])
  if err1 == nil  err2 == nil {
  rt += number_one - number_two
  fmt.Println("Result ", rt)
  }
 }
 case "mul":
 {
  rt := 1
  number_one, err1 := strconv.Atoi(args[2])
  number_two, err2 := strconv.Atoi(args[3])
  if err1 == nil  err2 == nil {
  rt = number_one * number_two
  fmt.Println("Result ", rt)
  }
 }
 case "sqrt":
 {
  rt := float64(0)
  if len(args) != 3 {
  fmt.Println("Usage: sqrt 2, return 1.4142135623730951")
  return nil
  }
  number_one, err := strconv.ParseFloat(args[2], 64)
  if err == nil {
  rt = math.Sqrt(number_one)
  fmt.Println("Result ", rt)
  }
 }
 default:
 help()

 }
 return nil
}

最后的效果大概是:

./calc add 1 2
Result 3

====================

./calc sub 1 2
Result -1

====================

./calc mul 10 20
Result 200

===================

./calc sqrt 2
Result 1.4142135623730951

2. flag 獲取命令行參數

flag 包比 os 讀取參數更方便。可以自定義傳入的參數的類型:比如字符串,整型,浮點型,默認參數設置等

基本的使用方法如下:

var operate string

flag.StringVar(operate,"o", "add", "operation for calc")

# 解釋

綁定 operate 變量, name="o", value="add" , usage="operation for calc"

也可以這樣定義為指針變量

var operate := flag.String("o", "add", "operation for calc")

同時還可以自定義 flag 類型

所有變量注冊之后,調用 flag.Parse() 來解析命令行參數, 如果是綁定變量的方式,直接使用變量進行操作,
如果使用指針變量型,需要 *operate 這樣使用。

flag.Args() 表示接收的所有命令行參數集, 也是一個切片

for index, value := range flag.Args {
 fmt.Println(index, value)
}
func CalcByFlag() error {
 var operation string
 var numberone float64
 var numbertwo float64
 flag.StringVar(operation, "o", "add", "operation for this tool")
 flag.Float64Var(numberone, "n1", 0, "The first number")
 flag.Float64Var(numbertwo, "n2", 0, "The second number")
 flag.Parse()
 fmt.Println(numberone, numbertwo)
 if operation == "add" {
 rt := numberone + numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "sub" {
 rt := numberone - numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "mul" {
 rt := numberone * numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "sqrt" {
 rt := math.Sqrt(numberone)
 fmt.Println("Result ", rt)
 } else {
 help()
 }
 return nil
}

最后的結果效果如下:

./calc -o add -n1 1 -n2 2
Result 3

=============================

./calc -o sub -n1 2 -n2 3
Result -1

============================

./calc -o mul -n1 10 -n2 20
Result 200

===========================

./calc -o sqrt -n1 2
Result 1.4142135623730951

3. CLI 框架

cli 是一款業界比較流行的命令行框架。

所以你首先需要安裝:

go get github.com/urfave/cli
# 一個簡單的示例如下:
package main

import (
 "fmt"
 "os"

 "github.com/urfave/cli"
)

func main() {
 app := cli.NewApp()
 app.Name = "boom"
 app.Usage = "make an explosive entrance"
 app.Action = func(c *cli.Context) error {
 fmt.Println("boom! I say!")
 return nil
 }

 app.Run(os.Args)
}

好,為實現 “簡單數學計算” 的功能,我們應該怎么實現呢?

主要是 使用 框架中的 Flag 功能,對參數進行設置

app.Flags = []cli.Flag {
 cli.StringFlag{
 Name: "operation, o",
 Value: "add",
 Usage: "calc operation",
 },
 cli.Float64Flag{
 Name: "numberone, n1",
 Value: 0,
 Usage: "number one for operation",
 },
 cli.Float64Flag{
 Name: "numbertwo, n2",
 Value: 0,
 Usage: "number two for operation",
 },
}

能看出,我們使用了三個參數:operation、numberone、numbertwo

同時定義了參數的類型,默認值,以及別名(縮寫)

那么在這個框架中如何實現參數的操作呢:主要是重寫app.Action 方法

app.Action = func(c *cli.Context) error {
 operation := c.String("operation")
 numberone := c.Float64("numberone")
 numbertwo := c.Float64("numbertwo")
 //fmt.Println(operation, numberone, numbertwo)
 if operation == "add" {
 rt := numberone + numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "sub" {
 rt := numberone - numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "mul" {
 rt := numberone * numbertwo
 fmt.Println("Result ", rt)
 } else if operation == "sqrt" {
 rt := math.Sqrt(numberone)
 fmt.Println("Result ", rt)
 } else {
 help()
 }
 return nil
}

# 對 operation 參數進行判斷,執行的是那種運算,然后編寫相應的運算操作
func CalcByCli(){
 app := cli.NewApp()
 app.Name = "calc with go"
 app.Usage = "calc tool operate by go"
 app.Version = "0.1.0"
 app.Flags = [] cli.Flag {
  cli.StringFlag{
   Name: "operation, o",
   Value: "add",
   Usage: "calc operation",
  },
  cli.Float64Flag{
   Name: "numberone, n1",
   Value: 0,
   Usage: "number one for operation",
  },
  cli.Float64Flag{
   Name: "numbertwo, n2",
   Value: 0,
   Usage: "number two for operation",
  },
 }
 app.Action = func(c *cli.Context) error {
  operation := c.String("operation")
  numberone := c.Float64("numberone")
  numbertwo := c.Float64("numbertwo")
  //fmt.Println(operation, numberone, numbertwo)
  if operation == "add" {
   rt := numberone + numbertwo
   fmt.Println("Result ", rt)
  } else if operation == "sub" {
   rt := numberone - numbertwo
   fmt.Println("Result ", rt)
  } else if operation == "mul" {
   rt := numberone * numbertwo
   fmt.Println("Result ", rt)
  } else if operation == "sqrt" {
   rt := math.Sqrt(numberone)
   fmt.Println("Result ", rt)
  } else {
   help()
  }
  return nil
 }
 app.Run(os.Args)
}

調用這個函數的最終效果如下:

./calc -o add --n1 12 --n2 12
Result 24

===================================

./calc -o sub --n1 100 --n2 200
Result -100

===================================

./calc -o mul --n1 10 --n2 20
Result 200

===================================

./calc -o sqrt --n1 2
Result 1.4142135623730951

4 其他

知道如何讀取命令行參數,就可以實現一些更有意思的事。

比如網上有許多免費的 API 接口,比如查詢天氣,查詢農歷的API 接口。

還有一些查詢接口,比如有道云翻譯接口,你可以實現翻譯的功能。

或者扇貝的接口,實現查詢單詞的功能。

再比如一些音樂接口,實現音樂信息查詢。

不一一列了。

下面實現一個調用免費的查詢天氣的接口實現命令行查詢天氣。

GO 如何進行 HTTP 訪問?內置的 net/http 可以實現

一個簡易的GET 操作如下:

func Requests(url string) (string, error) {
 response, err := http.Get(url)
 if err != nil {
  return "", err
 }
 defer response.Body.Close()
 body, _ := ioutil.ReadAll(response.Body)
 return string(body), nil
}

免費的 API URL 如下:

http://www.sojson.com/open/api/weather/json.shtml?city=北京

返回的結果是一個Json 格式的數據

{
 "status": 200,
 "data": {
  "wendu": "29",
  "ganmao": "各項氣象條件適宜,發生感冒機率較低。但請避免長期處于空調房間中,以防感冒。",
  "forecast": [
   {
    "fengxiang": "南風",
    "fengli": "3-4級",
    "high": "高溫 32℃",
    "type": "多云",
    "low": "低溫 17℃",
    "date": "16日星期二"
   },
   {
    "fengxiang": "南風",
    "fengli": "微風級",
    "high": "高溫 34℃",
    "type": "晴",
    "low": "低溫 19℃",
    "date": "17日星期三"
   },
   {
    "fengxiang": "南風",
    "fengli": "微風級",
    "high": "高溫 35℃",
    "type": "晴",
    "low": "低溫 22℃",
    "date": "18日星期四"
   },
   {
    "fengxiang": "南風",
    "fengli": "微風級",
    "high": "高溫 35℃",
    "type": "多云",
    "low": "低溫 22℃",
    "date": "19日星期五"
   },
   {
    "fengxiang": "南風",
    "fengli": "3-4級",
    "high": "高溫 34℃",
    "type": "晴",
    "low": "低溫 21℃",
    "date": "20日星期六"
   }
  ],
  "yesterday": {
   "fl": "微風",
   "fx": "南風",
   "high": "高溫 28℃",
   "type": "晴",
   "low": "低溫 15℃",
   "date": "15日星期一"
  },
  "aqi": "72",
  "city": "北京"
 },
 "message": "OK"
}

所以我們的任務就是傳入 “城市” 的名稱,再對返回的 Json 數據解析。

package main

import (
  "fmt"
  "os"
 "encoding/json"
  "github.com/urfave/cli"
  "net/http"
  "io/ioutil"
  //"github.com/modood/table"
)
type Response struct {
  Status int `json:"status"`
  CityName string `json:"city"`
  Data  Data `json:"data"`
  Date  string `json:"date"`
  Message string `json:"message"`
  Count int `json:"count"`
}

type Data struct {
  ShiDu  string `json:"shidu"`
  Quality string `json:"quality"`
  Ganmao string `json:"ganmao"`
  Yesterday Day `json:"yesterday"`
  Forecast []Day `json:"forecast"`
}

type Day struct {
  Date string `json:"date"`
  Sunrise string `json:"sunrise"`
  High string `json:"high"`
  Low  string `json:"low"`
  Sunset string `json:"sunset"`
  Aqi  float32 `json:"aqi"`
  Fx  string `json:"fx"`
  Fl  string `json:"fl"`
  Type string `json:"type"`
  Notice string `json:"notice"`
}

func main() {
  const apiURL = "http://www.sojson.com/open/api/weather/json.shtml?city="
  app := cli.NewApp()
  app.Name = "weather-cli"
  app.Usage = "天氣預報小程序"

  app.Flags = []cli.Flag{
    cli.StringFlag{
      Name: "city, c",
      Value: "上海",
      Usage: "城市中文名",
    },
    cli.StringFlag{
      Name: "day, d",
      Value: "今天",
      Usage: "可選: 今天, 昨天, 預測",
    },
    cli.StringFlag{
      Name: "Author, r",
      Value: "xiewei",
      Usage: "Author name",
    },
  }

  app.Action = func(c *cli.Context) error {
    city := c.String("city")
    day := c.String("day")

    var body, err = Requests(apiURL + city)
    if err != nil {
      fmt.Printf("err was %v", err)
      return nil
    }

    var r Response
    err = json.Unmarshal([]byte(body), r)
    if err != nil {
      fmt.Printf("\nError message: %v", err)
      return nil
    }
    if r.Status != 200 {
      fmt.Printf("獲取天氣API出現錯誤, %s", r.Message)
      return nil
    }
    Print(day, r)
    return nil
  }
  app.Run(os.Args)

}


func Print(day string, r Response) {
  fmt.Println("城市:", r.CityName)
  if day == "今天" {
    fmt.Println("濕度:", r.Data.ShiDu)
    fmt.Println("空氣質量:", r.Data.Quality)
    fmt.Println("溫馨提示:", r.Data.Ganmao)
  } else if day == "昨天" {
    fmt.Println("日期:", r.Data.Yesterday.Date)
    fmt.Println("溫度:", r.Data.Yesterday.Low, r.Data.Yesterday.High)
    fmt.Println("風量:", r.Data.Yesterday.Fx, r.Data.Yesterday.Fl)
    fmt.Println("天氣:", r.Data.Yesterday.Type)
    fmt.Println("溫馨提示:", r.Data.Yesterday.Notice)
  } else if day == "預測" {
    fmt.Println("====================================")
    for _, item := range r.Data.Forecast {
      fmt.Println("日期:", item.Date)
      fmt.Println("溫度:", item.Low, item.High)
      fmt.Println("風量:", item.Fx, item.Fl)
      fmt.Println("天氣:", item.Type)
      fmt.Println("溫馨提示:", item.Notice)
      fmt.Println("====================================")
    }
  } else {
    fmt.Println("...")
  }

}
func Requests(url string) (string, error) {
  response, err := http.Get(url)
  if err != nil {
    return "", err
  }
  defer response.Body.Close()
  body, _ := ioutil.ReadAll(response.Body)
  return string(body), nil
}

最終的效果大概如下:

./weather -c 上海

城市: 上海
濕度: 80%
空氣質量: 輕度污染
溫馨提示: 兒童、老年人及心臟、呼吸系統疾病患者人群應減少長時間或高強度戶外鍛煉


================================
./weaather -c 上海 -d 昨天

城市: 上海
日期: 28日星期二
溫度: 低溫 12.0℃ 高溫 19.0℃
風量: 西南風 3級
天氣: 小雨
溫馨提示: 霧蒙蒙的雨天,最喜歡一個人聽音樂

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Go語言中使用flag包對命令行進行參數解析的方法
  • Go語言中一些不常見的命令參數詳解

標簽:瀘州 阿壩 泰安 晉中 滄州 駐馬店 東營 昭通

巨人網絡通訊聲明:本文標題《Go語言中讀取命令參數的幾種方法總結》,本文關鍵詞  語,言中,讀取,命令,參數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言中讀取命令參數的幾種方法總結》相關的同類信息!
  • 本頁收集關于Go語言中讀取命令參數的幾種方法總結的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    五月天综合视频| 国产精品私人影院| 天天影视涩香欲综合网| 野花视频免费在线观看| 91国产免费观看| 亚洲视频1区2区| www.亚洲激情.com| 私库av在线播放| 最新高清无码专区| 不卡电影免费在线播放一区| 中文字幕av播放| 日韩一区中文字幕| 91亚洲精品一区二区乱码| 色综合色综合色综合| 亚洲欧美日韩久久| 粗大的内捧猛烈进出视频| 欧美人妇做爰xxxⅹ性高电影| 亚洲午夜电影网| 久久久久久久无码| 精品毛片乱码1区2区3区| 精品伊人久久久久7777人| 青青青视频在线播放| 国产欧美日本一区二区三区| 岛国一区二区三区| 日本高清不卡aⅴ免费网站| 一区二区国产视频| 欧美日韩人妻精品一区在线| 日韩免费视频一区| 国产一区二区福利视频| 国产大片免费看| 夜夜嗨av一区二区三区中文字幕| 无码av免费精品一区二区三区| 91精品国产入口| 国产专区欧美精品| 极品盗摄国产盗摄合集| 亚洲网友自拍偷拍| 亚洲自拍偷拍图| 亚洲欧洲另类国产综合| www.四虎精品| 精品国产sm最大网站免费看| 国产精品一二二区| 欧洲一区二区三区免费视频| 日韩激情视频网站| 欧美视频一区二区在线| 亚洲精品国产精品乱码不99 | 蜜臀久久99精品久久久久宅男| 精品无人区无码乱码毛片国产| 欧美国产禁国产网站cc| 伦伦影院午夜理论片| 日韩欧美国产高清| 成人午夜免费电影| 欧美福利一区二区| 国产精品自拍毛片| 欧美日韩情趣电影| 国产一区二区精品久久91| 欧洲精品在线观看| 精品影视av免费| 在线免费亚洲电影| 裸体歌舞表演一区二区| 一本到不卡精品视频在线观看| 丝袜美腿成人在线| 色哟哟一一国产精品| 亚洲成人在线免费| 国产精品suv一区二区88| 亚洲国产成人高清精品| 色婷婷国产精品免| 亚洲一区二区三区激情| 无码人中文字幕| 亚洲国产精品久久不卡毛片| 精品在线观看一区| 午夜国产精品一区| 婷婷在线精品视频| 麻豆成人91精品二区三区| 在线亚洲一区二区| 国产一区二区免费视频| 5566中文字幕一区二区电影| 成人免费视频一区二区| 精品国产123| 国产精品果冻传媒| 中文字幕欧美一| 国产综合精品在线| 亚洲6080在线| 我家有个日本女人| 国产一区福利在线| 欧美一级二级三级蜜桃| 91美女在线视频| 中文字幕精品在线不卡| 中文字幕一区二区三区人妻电影| 一区二区三区自拍| 97在线观看免费高| 激情欧美一区二区三区在线观看| 欧美高清dvd| 欧美xxxx黑人| 亚洲视频一区二区在线| 日本伦理一区二区三区| 免费av成人在线| 678五月天丁香亚洲综合网| 91色porny在线视频| 中文一区在线播放| 超碰人人干人人| 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩亚洲另类| 91香蕉视频在线| 中文字幕视频一区| 国产免费美女视频| 国产精品系列在线观看| 久久免费午夜影院| wwwwxxxx国产| 免费在线观看不卡| 欧美一区二区不卡视频| 日本一区二区在线观看视频| 一区二区激情小说| 欧美系列一区二区| 丰满少妇一区二区三区专区| 亚洲区小说区图片区qvod| 老熟妇高潮一区二区三区| 国产一区二区剧情av在线| 久久综合久久综合九色| 国产一二三四五区| 另类人妖一区二区av| 精品奇米国产一区二区三区| 中文字幕在线观看网址| 日韩精品福利网| 日韩欧美一区中文| 亚洲专区区免费| 美国av一区二区| 欧美精品一区二区精品网| 97人妻精品一区二区免费| 麻豆精品视频在线观看免费| 精品人在线二区三区| av黄色在线免费观看| 开心九九激情九九欧美日韩精美视频电影| 欧美一区二区三区免费大片 | 精品人妻一区二区免费| 亚洲一本大道在线| 欧美高清视频不卡网| 亚洲综合自拍网| 麻豆一区二区在线| 久久久噜噜噜久久人人看| 免费在线观看a视频| 国产精品自拍一区| 中文字幕一区二区三区四区不卡| 欧美三级日本三级| 绯色av蜜臀vs少妇| 青青草国产精品97视觉盛宴 | 另类中文字幕网| 久久久www免费人成精品| 天海翼在线视频| 99综合影院在线| 亚洲国产综合色| 日韩欧美成人午夜| 国产日产在线观看| www..com久久爱| 亚洲线精品一区二区三区| 欧美一激情一区二区三区| 成年人免费观看视频网站| 国产美女一区二区| 亚洲欧美另类在线| 91精品国产福利在线观看| 亚洲精品国产精品国自产网站| 风间由美一区二区三区在线观看 | 一道本在线观看| 成人午夜免费视频| 亚洲福利视频一区| xf在线a精品一区二区视频网站| 蜜桃视频最新网址| 欧美性猛交乱大交| 奇米888四色在线精品| 亚洲国产精品精华液ab| 欧美日韩中文字幕一区二区| 一级性生活毛片| 成人免费精品视频| 亚洲成年人影院| 国产欧美一区二区精品久导航 | 成年人av电影| 国产伦精品一区三区精东| 国产一区二区三区精品欧美日韩一区二区三区 | 精品亚洲乱码一区二区| 成人在线短视频| 久久99国产精品免费| 亚洲色图欧洲色图| 欧美成人激情免费网| 一本色道久久综合亚洲aⅴ蜜桃| v天堂中文在线| 成人午夜又粗又硬又大| 日韩一区精品字幕| 国产精品入口麻豆原神| 91精品一区二区三区在线观看| 波多野结衣欲乱| 给我免费观看片在线电影的| 成人中文字幕电影| 日本少妇一区二区| 亚洲美女偷拍久久| 久久精品免视看| 91精品久久久久久久91蜜桃 | 国产麻豆视频在线观看| 国产极品一区二区| 波多野结衣在线一区| 久久疯狂做爰流白浆xx| 亚洲综合激情另类小说区|