最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang實(shí)現(xiàn)獲取與解析命令行參數(shù)

 更新時(shí)間:2024年01月24日 08:04:23   作者:夢(mèng)_魚  
這篇文章主要為大家詳細(xì)介紹了Golang如何實(shí)現(xiàn)獲取與解析命令行參數(shù),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下

1. 解析命令行參數(shù)

程序在執(zhí)行時(shí),獲取在命令行啟動(dòng)程序是使用的參數(shù)

  • 命令行( Command line interface -- CLI):基于文本來查看、處理、操作計(jì)算機(jī)的界面,又被稱為 終端、控制臺(tái)
  • 命令:在命令行執(zhí)行的程序,一般是一行,包含命令名字、子命令與命令相關(guān)的選項(xiàng)(Flag),
  • Flag:傳遞給命令的參數(shù),通過參數(shù)全稱或者參數(shù)首字符指定參數(shù)名稱,參數(shù)之后使用=或空格連接參數(shù)與參數(shù)值

2. Golang 獲取命令行參數(shù)

os.Args: 返回一個(gè)字符串slice,第一個(gè)當(dāng)前程序自身路徑,剩余參數(shù)是傳遞給命令行的參數(shù)

傳遞的參數(shù)一般是 --key=value 形式 、簡(jiǎn)寫 -k value 形式或者是一個(gè)開關(guān)標(biāo)志 -k,使用os.Args只是獲取一個(gè)以空格分隔的字符串列表,無法很好的解析傳遞進(jìn)來的參數(shù)到變量中

package main

import (
	"fmt"
	"os"
)

func main() {
	commandArgs := os.Args
	fmt.Println(commandArgs)
}

執(zhí)行程序: 遞歸瀏覽指定目錄下所有文件

go run main.go --name ls --value /etc -r

輸出:

[/tmp/go-build2637413899/b001/exe/main --name ls --value /etc -r]

命令行參數(shù)解析 -- flag包

需要知曉程序的命令行需要傳遞哪些參數(shù),如果沒有傳遞該參數(shù),那么默認(rèn)值是什么,參數(shù)的說明

使用flag的流程:

1. 初始化存放命令行參數(shù)的全局變量

2. 在main包的init函數(shù)中注冊(cè)需要解析的命令行參數(shù),包含參數(shù)的類型、參數(shù)存放到哪個(gè)變量、參數(shù)的名稱、參數(shù)的默認(rèn)值、參數(shù)的使用說明

3. 在定義解析命令行參數(shù)最后,添加 flag.Parse(),解析傳遞到程序的命令行參數(shù)到變量中

4. 主函數(shù)中通過全局變量引用命令行參

5. 運(yùn)行主函數(shù),通過 -<參數(shù)名>=<value> 或  -<參數(shù)名> <value> 方式傳參

解析命令行參數(shù)的基本文法:
1. flag.<類型>Var(<指針>, <參數(shù)名稱>, <默認(rèn)值>, <用法說明>)

2. 等價(jià)方法: flag.<類型>(<參數(shù)名稱>, <默認(rèn)值>, <用法說明>)

- 區(qū)別在于,Var后綴方法是通過指針將值存放到指針指向的變量,未帶Var后綴的方法返回一個(gè)指定值的指針

- 相同的,參數(shù)值不同則使用不同的類型,都包含參數(shù)的名稱、參數(shù)的默認(rèn)值、該參數(shù)使用說明

- 類型是基本數(shù)據(jù)類型:int int64 uint uint64 string bool fl0at64 Duration

package main

import (
	"flag"
	"fmt"
)

// 1. 聲明保存命令行參數(shù)的變量
var (
	name        string
	value       string
	isRecursive bool
)

func init() {
	// 2. 注冊(cè)需要解析的命令行參: 參數(shù)名、默認(rèn)值、參數(shù)說明
	flag.StringVar(&name, "name", "none", "執(zhí)行命令的名稱")
	flag.StringVar(&value, "value", "none", "執(zhí)行命令的參數(shù)")
	flag.BoolVar(&isRecursive, "recursive", false, "是否遞歸")

	// 3. 解析命令行參數(shù)
	flag.Parse()
}

func main() {
	// 4. 主程序中通過全局變量引用命令行參
	fmt.Println(name, value, isRecursive)
}
# 輸出:ls /etc true
go run main.go -name ls -value /etc -recursive

# 輸出: ls /etc false
go run main.go -name ls -value /etc

Flag包相關(guān)的其他方法

flag.Set()解析后修改或設(shè)置命令行參數(shù)

package main

import (
	"flag"
	"fmt"
)

// 1. 聲明保存命令行參數(shù)的變量
var (
	name string
)

func init() {
	// 2. 聲明需要解析的命令行參: 參數(shù)名、默認(rèn)值、參數(shù)說明
	flag.StringVar(&name, "name", "none", "執(zhí)行命令的名稱")

	// 將name的值修改為 find
	flag.Set("name", "find")
}

func main() {
	// 4. 主程序中通過全局變量引用命令行參
	fmt.Println(name)
}
# 輸出:find
go run main.go -name ls

flog.NFlag() 返回被設(shè)置的flag數(shù)量

package main

import (
	"flag"
	"fmt"
)

// 1. 聲明保存命令行參數(shù)的變量
var (
	name        string
	value       string
	isRecursive bool
)

func init() {
	flag.StringVar(&name, "name", "none", "執(zhí)行命令的名稱")
	flag.StringVar(&value, "value", "none", "執(zhí)行命令的參數(shù)")
	flag.BoolVar(&isRecursive, "recursive", false, "是否遞歸")
    
	flag.Parse()
}

func main() {
	fmt.Println("number of set flag:", flag.NFlag())
}
# 輸出:number of set flag: 2
go run main.go -name ls -value /etc

flag,Parsed() 檢查 flag.Parse()是否被調(diào)用過

package main

import (
	"flag"
	"fmt"
)

// 1. 聲明保存命令行參數(shù)的變量
var (
	name        string
	value       string
	isRecursive bool
)

func init() {
	flag.StringVar(&name, "name", "none", "執(zhí)行命令的名稱")
	flag.StringVar(&value, "value", "none", "執(zhí)行命令的參數(shù)")
	flag.BoolVar(&isRecursive, "recursive", false, "是否遞歸")

	flag.Parse()
}

func main() {
	fmt.Println("is Parsed", flag.Parsed())
}
# 輸出:is Parsed true
go run main.go -name ls -value /etc

flag.Visit(func (*Flag)) 按字典順序遍歷,進(jìn)行設(shè)置了的標(biāo)簽

package main

import (
	"flag"
	"fmt"
)

// 1. 聲明保存命令行參數(shù)的變量
var (
	name        string
	value       string
	isRecursive bool
)

func init() {
	flag.StringVar(&name, "name", "none", "執(zhí)行命令的名稱")
	flag.StringVar(&value, "value", "none", "執(zhí)行命令的參數(shù)")
	flag.BoolVar(&isRecursive, "recursive", false, "是否遞歸")

	flag.Parse()
}

func main() {
	flag.Visit(func(f *flag.Flag) {
		fmt.Printf("Name: %s, Value: %s, DefValue: %s, Usage: %s \n", f.Name, f.Value, f.DefValue, f.Usage)
	})
}
# 輸出: 
# Name: name, Value: ls, DefValue: none, Usage: 執(zhí)行命令的名稱 
# Name: value, Value: /etc, DefValue: none, Usage: 執(zhí)行命令的參數(shù) 
go run main.go -name ls -value /etc

到此這篇關(guān)于Golang實(shí)現(xiàn)獲取與解析命令行參數(shù)的文章就介紹到這了,更多相關(guān)Go命令行參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang flag簡(jiǎn)單用法

    golang flag簡(jiǎn)單用法

    本篇文章介紹了golang flag包的一個(gè)簡(jiǎn)單的用法,希望通過一個(gè)簡(jiǎn)單的實(shí)例,能讓大家了解它的用法,從中獲得啟發(fā)
    2018-09-09
  • golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解

    golang利用unsafe操作未導(dǎo)出變量-Pointer使用詳解

    這篇文章主要給大家介紹了關(guān)于golang利用unsafe操作未導(dǎo)出變量-Pointer使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • 淺談Go語言的高效編碼細(xì)節(jié)

    淺談Go語言的高效編碼細(xì)節(jié)

    這篇文章主要介紹了淺談Go語言的高效編碼細(xì)節(jié),我們都知道golang是天生的高并發(fā),高效的編譯型語言,可我們也都可知道,工具再好,用法不對(duì),全都白費(fèi),我們來舉2個(gè)常用路徑來感受一下
    2023-01-01
  • golang中字符串MD5生成方式總結(jié)

    golang中字符串MD5生成方式總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于golang中字符串MD5生成方式總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • Go編譯32位GNU靜態(tài)鏈接庫的方法

    Go編譯32位GNU靜態(tài)鏈接庫的方法

    Go鏈接庫系統(tǒng)的難用可謂是人盡皆知,不同Go版本編譯出來的不兼容,而且只支持GNU的,不能編譯出Windows上的dll和lib。這篇文章給大家介紹Go編譯32位GNU靜態(tài)鏈接庫的方法,感興趣的朋友一起看看吧
    2020-05-05
  • golang實(shí)現(xiàn)webgis后端開發(fā)的步驟詳解

    golang實(shí)現(xiàn)webgis后端開發(fā)的步驟詳解

    這篇文章主要介紹如何用golang結(jié)合postgis數(shù)據(jù)庫,使用gin、grom框架實(shí)現(xiàn)后端的MVC的接口搭建,文中有詳細(xì)的流程步驟及代碼示例,需要的朋友可以參考下
    2023-06-06
  • Golang中map的深入探究

    Golang中map的深入探究

    Go中Map是一個(gè)KV對(duì)集合,下面這篇文章主要給大家介紹了關(guān)于Golang中map探究的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-09-09
  • golang指數(shù)運(yùn)算操作

    golang指數(shù)運(yùn)算操作

    這篇文章主要介紹了golang指數(shù)運(yùn)算操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang中錯(cuò)誤處理機(jī)制詳解

    Golang中錯(cuò)誤處理機(jī)制詳解

    平時(shí)在項(xiàng)目開發(fā)過程中少不了對(duì)錯(cuò)誤的處理,一個(gè)好用的系統(tǒng)首先要確保其健壯性,不能經(jīng)常發(fā)生錯(cuò)誤就卡死之類的情況,為了讓我們的程序更加健壯,我們就需要知道golang里的錯(cuò)誤處理機(jī)制是怎么樣的,這篇文章帶大家一起學(xué)習(xí),需要的朋友跟著小編一起來看看吧
    2024-05-05
  • 深入了解Golang官方container/list原理

    深入了解Golang官方container/list原理

    在?Golang?的標(biāo)準(zhǔn)庫?container?中,包含了幾種常見的數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),其實(shí)是非常好的學(xué)習(xí)材料,本文主要為大家介紹了container/list的原理與使用,感興趣的可以了解一下
    2023-08-08

最新評(píng)論

托里县| 安吉县| 旬邑县| 绥芬河市| 巴中市| 郎溪县| 远安县| 永安市| 曲沃县| 卫辉市| 海门市| 勃利县| 公安县| 高碑店市| 五原县| 墨玉县| 谢通门县| 河源市| 上饶市| 深圳市| 金昌市| 分宜县| 衡东县| 明星| 肥城市| 黄冈市| 台前县| 金塔县| 大英县| 富川| 腾冲县| 榆中县| 电白县| 望谟县| 凤翔县| 隆林| 大名县| 赣榆县| 江阴市| 景洪市| 兴化市|