欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

傳遞的參數(shù)一般是 --key=value 形式 、簡(jiǎn)寫(xiě) -k value 形式或者是一個(gè)開(kāi)關(guān)標(biāo)志 -k,使用os.Args只是獲取一個(gè)以空格分隔的字符串列表,無(wú)法很好的解析傳遞進(jìn)來(lái)的參數(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ù),如果沒(méi)有傳遞該參數(shù),那么默認(rèn)值是什么,參數(shù)的說(shuō)明

使用flag的流程:

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

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

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

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

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

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

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

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

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

- 類(lèi)型是基本數(shù)據(jù)類(lèi)型: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ù)說(shuō)明
	flag.StringVar(&name, "name", "none", "執(zhí)行命令的名稱(chēng)")
	flag.StringVar(&value, "value", "none", "執(zhí)行命令的參數(shù)")
	flag.BoolVar(&isRecursive, "recursive", false, "是否遞歸")

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

func main() {
	// 4. 主程序中通過(guò)全局變量引用命令行參
	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ù)說(shuō)明
	flag.StringVar(&name, "name", "none", "執(zhí)行命令的名稱(chēng)")

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

func main() {
	// 4. 主程序中通過(guò)全局變量引用命令行參
	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í)行命令的名稱(chēng)")
	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)用過(guò)

package main

import (
	"flag"
	"fmt"
)

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

func init() {
	flag.StringVar(&name, "name", "none", "執(zhí)行命令的名稱(chēng)")
	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í)行命令的名稱(chēng)")
	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í)行命令的名稱(chēng) 
# 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使用pprof檢查內(nèi)存泄漏的全過(guò)程

    Golang使用pprof檢查內(nèi)存泄漏的全過(guò)程

    pprof 是golang提供的一款分析工具,可以分析CPU,內(nèi)存的使用情況,本篇文章關(guān)注它在分析內(nèi)存泄漏方面的應(yīng)用,本文給大家介紹了Golang使用pprof檢查內(nèi)存泄漏的全過(guò)程,文中通過(guò)代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼

    Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼

    這篇文章主要介紹了Golang Map實(shí)現(xiàn)賦值和擴(kuò)容的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Goland支持泛型了(上機(jī)實(shí)操)

    Goland支持泛型了(上機(jī)實(shí)操)

    Go的泛型不是還在設(shè)計(jì)草圖嗎?最樂(lè)觀估計(jì)也要2021年8月份。你說(shuō)Go語(yǔ)言現(xiàn)在都沒(méi)開(kāi)發(fā)好泛型,你支持這個(gè)特性有什么用呢?感興趣的朋友跟隨小編一起看看吧
    2020-12-12
  • 源碼剖析Golang如何fork一個(gè)進(jìn)程

    源碼剖析Golang如何fork一個(gè)進(jìn)程

    創(chuàng)建一個(gè)新進(jìn)程分為兩個(gè)步驟,一個(gè)是fork系統(tǒng)調(diào)用,一個(gè)是execve?系統(tǒng)調(diào)用,本文將從源碼的角度帶大家剖析一下Golang是如何fork一個(gè)進(jìn)程的
    2023-06-06
  • golang如何讓string轉(zhuǎn)int64

    golang如何讓string轉(zhuǎn)int64

    這篇文章主要介紹了golang如何讓string轉(zhuǎn)int64問(wèn)題,
    2024-02-02
  • GO如何模擬流操作實(shí)現(xiàn)示例探究

    GO如何模擬流操作實(shí)現(xiàn)示例探究

    這篇文章主要為大家介紹了GO如何模擬流操作實(shí)現(xiàn)示例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 10個(gè)可以?xún)?yōu)化代碼的Go語(yǔ)言技巧分享

    10個(gè)可以?xún)?yōu)化代碼的Go語(yǔ)言技巧分享

    這篇文章主要為大家詳細(xì)介紹了10個(gè)可以?xún)?yōu)化代碼的Go語(yǔ)言技巧,從而讓我們的代碼更加優(yōu)雅,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下
    2024-01-01
  • Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解

    Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解

    這篇文章主要為大家介紹了Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 下載golang.org/x包的操作方法

    下載golang.org/x包的操作方法

    今天小編就為大家分享一篇下載golang.org/x包的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Go?Build編譯打包文件的完整步驟

    Go?Build編譯打包文件的完整步驟

    go build命令是用于編譯Go語(yǔ)言程序并生成可執(zhí)行文件,它可以將Go源代碼編譯成機(jī)器代碼,并將其打包成可執(zhí)行文件,方便在不同的操作系統(tǒng)上運(yùn)行,這篇文章主要給大家介紹了關(guān)于Go?Build編譯打包文件的完整步驟,需要的朋友可以參考下
    2024-02-02

最新評(píng)論