對于程式來說,最本質的就是處理用戶的輸入和輸出,Go生成的可執行檔案當然也不例外,我們同樣可以讓我們的可執行檔案擁有處理輸入引數的能力,
windows系統中我們經常使用的cmd命令列工具大家很熟悉了,今天我們就模擬下cmd,利用go內置的os包獲取一些系統資訊,
獲取程式輸入引數
在Go程式中,程式的命令列引數可從os包的Args變數獲取,os包外部使用os.Args訪問該變數,首先創建一個新的專案,然后匯入os包,然后簡單列印下該變數:
package main
import "os"
func main() {
var args = os.Args
for index,element := range args{
println("--------------------------------------------------------------------------------")
println("索引:",index,"| 引數:",element)
}
}
此時運行程式:

os.Args至少有一個元素,該元素代表著命令本身的名稱,也就是可執行程式的全路徑,注意如果在可執行程式的目錄下執行,那么該值就是可執行程式的名稱,

當然了我們也可以不用寫后綴,直接qos也是可以的:

這樣子是不是和我們經常使用的命令列命令沒什么區別了呢,不過這樣子做是有前提條件的,那就是在系統的環境變數中你已經制定pathext:

如果我們試著去掉exe:

我這里使用的是win10的作業系統,如果大家碰到類似的,可以檢查下上面是否包含了你希望運行的檔案的后綴,
傳遞程式引數
傳遞引數和cmd一樣,引數之間以空格作為分隔,至于輸入什么看你喜歡了,

下面我們就os包的一些函式做個簡單的使用,具體的就不再多說,代碼中會有注釋,
更多的內容如果大家有興趣可以自己去看看,畢竟我自己好多都沒整明白,,,如果發現哪里有錯誤的地方希望可以留言提醒下,好讓我及時修改,免得給大家錯誤的例子,
示例代碼
package main
import "os"
/*
處理程式引數,這里我們只處理單個引數
示例:
qos hostname
qos filename test.txt
如果沒有輸入引數,那么提示用戶輸入必要的引數
*/
// 定義程式可以處理的命令
var cmdArray = [...]string{
//內核提供的主機名
"hostname",
//底層的系統記憶體頁的尺寸
"page",
//環境變數 格式為"key=value"
"environ",
//呼叫者的用戶ID
"uid",
//呼叫者的有效用戶ID
"euid",
//呼叫者所在行程的行程ID
"pid",
//呼叫者所在行程的父行程的行程ID
"ppid",
//對應當前作業目錄的根路徑
"wd",
}
func main() {
// 獲取用戶輸入引數,排除程式名稱本身:qos
var paramsCount = len(os.Args) - 1
// 如果引數數量為0,那么提示用戶輸入引數,并列印可以使用的引數串列
if paramsCount == 0 {
println("請輸入您要執行的命令,您可以使用以下命令:")
println("用法:")
println(" qos <command> [arguments]")
println("命令:")
println("\tqos hostname", "\t", "獲取內核提供的主機名")
println("\tqos page ", "\t", "獲取底層的系統記憶體頁的尺寸")
println("\tqos environ ", "\t", "獲取環境變數")
println("\tqos uid ", "\t", "獲取呼叫者的用戶ID")
println("\tqos euid ", "\t", "獲取呼叫者的有效用戶ID")
println("\tqos pid ", "\t", "獲取呼叫者所在行程的行程ID")
println("\tqos ppid ", "\t", "獲取呼叫者所在行程的父行程的行程ID")
println("\tqos wd ", "\t", "獲取對應當前作業目錄的根路徑")
os.Exit(-1)
}
// 獲取輸入命令
var command = os.Args[1]
// 根據輸入的命令輸出對應的結果
switch command {
case "hostname":
var hostname, _ = os.Hostname()
println("hostname:\t", hostname)
case "page":
var page = os.Getpagesize()
println("page:\t", page)
case "environ":
var environ = os.Environ()
for key := range environ {
println(environ[key])
}
case "uid":
var uid = os.Geteuid()
println("uid:\t", uid)
case "euid":
var euid = os.Geteuid()
println("euid:\t", euid)
case "pid":
var pid = os.Getpid()
println("pid:\t", pid)
case "ppid":
var ppid = os.Getppid()
println("ppid:\t", ppid)
case "wd":
var wd, _ = os.Getwd()
println("wd:\t", wd)
default:
println("無法識別引數:", command)
}
}
效果:

使用flag包
package main
import (
"flag"
"os"
)
var (
hostname bool
page bool
environ bool
uid bool
euid bool
pid bool
ppid bool
wd bool
)
func init() {
// 注冊flag
flag.BoolVar(&hostname, "hostname", false, "獲取內核提供的主機名")
flag.BoolVar(&page, "page", false, "獲取底層的系統記憶體頁的尺寸")
flag.BoolVar(&environ, "environ", false, "獲取環境變數")
flag.BoolVar(&uid, "uid", false, "獲取呼叫者的用戶ID")
flag.BoolVar(&euid, "euid", false, "獲取呼叫者的有效用戶ID")
flag.BoolVar(&pid, "pid", false, "獲取呼叫者所在行程的行程ID")
flag.BoolVar(&ppid, "ppid", false, "獲取呼叫者所在行程的父行程的行程ID")
flag.BoolVar(&wd, "wd", false, "獲取對應當前作業目錄的根路徑")
}
/*
處理程式引數,使用flag包
*/
func main() {
// 引數決議,遇到非flag引數停止,可以使用flag.Args()函式獲取類似 qflag hostname這樣的引數
flag.Parse()
if hostname {
var hostname, _ = os.Hostname()
println("hostname:\t", hostname)
}
if page {
var page = os.Getpagesize()
println("page:\t", page)
}
if environ {
var environ = os.Environ()
for key := range environ {
println(environ[key])
}
}
if uid {
var uid = os.Geteuid()
println("uid:\t", uid)
}
if euid {
var euid = os.Geteuid()
println("euid:\t", euid)
}
if pid {
var pid = os.Getpid()
println("pid:\t", pid)
}
if ppid {
var ppid = os.Getppid()
println("ppid:\t", ppid)
}
if wd {
var wd, _ = os.Getwd()
println("wd:\t", wd)
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/249116.html
標籤:區塊鏈
