Hike News
Hike News

Golang物件導向初識-day22-命令行參數

Introduction

  • 之前執行程序都是go build命令編譯成exe格式,不帶參數直接執行
  • 但在線上開發業務時必須帶參數(指定配置文件等操作)

os.Args

  • 其為string類型的切片
  • 若是在執行程序時,命令行沒有傳入參數,os.Args切片中只有一個元素,也就是程序自身

example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import (
"fmt"
"os"
)

func testArgs(){
fmt.Println("The Args length is: ",len(os.Args))
for i,v := range(os.Args){
fmt.Printf("index %d is %s\n",i,v)
}
return
}

func main(){
testArgs()
}

result

1
2
3
4
5
6
7
8
9
> main.exe
> The Args length is: 1
index 0 is main.exe

> main.exe -c D:/go_dev
> The Args length is: 3
index 0 is main.exe
index 1 is -c
index 2 is D:/go_dev
  • 可以發現自定義傳入的參數,其index皆由1開始
  • 且傳入的每一個參數皆由空格(space)分割

tips

  • 使用以上的方法去設置參數非常的不友好
  • 且會限制使用者對於參數的使用法
  • 通常使用以上的方法是為了單純獲取使用者傳入的所有參數

package flag

透過flag包可以用來解析(讀取)命令行的參數,其接受的類型皆為指針

  1. flag.BoolVar(&test, "b", false, "input bool") 其接收的為boolean值
  2. flag.StringVar(&str, "s", "", "input string") 其接收的為string值
  3. flag.IntVar(&count, "c", 1001, "input int") 其接收為int值
  • 第一個參數為接收值的變量之地址(類似scanf)
  • 第二個參數為key的名字
  • 第三個參數為默認值(default value),如果未指定key指向的值,便傳入默認值
  • 第四個參數為說明

example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import(
"fmt"
"flag"
)

func main(){
var configpath string
var port int
flag.StringVar(&configpath,"c","","input config path")
flag.IntVar(&port,"p",3389,"input port ")

//上面寫完(預處理)仍不生效,需調用Parse()方法才會生效
flag.Parse()
fmt.Println("configpath:",configpath,"port:",port, "start")
}

result

1
2
> main.exe -c /var/mysql/config.conf -p 3306
configpath: /var/mysql/config.conf port: 3306 start