Go使用flag包開發命令行工具


flag包是Go語言標准庫提供用來解析命令行參數的包,使得開發命令行工具更為簡單

常用方法

1.flag.Usage

輸出使用方法,如linux下ls -h的幫助輸出

2.flag.Type(參數名, 默認值, 使用提示)

Type為類型 如String, Int, Uint 調用相應的flag.Sring flag.Int flag.Uint方法

方法返回相應類型的指針

3.flag.Type(指針, 參數名, 默認值, 使用提示)

與flag.Type方法基本相同,不同的是多一個指針參數,將使用傳入的指針,不會再創建指針返回

4.flag.Args

返回解析完命令行參數后的其他參數,如./sh -name cqh  a1 a2,將返回a1 a2

5.flag.Parse

執行解析

使用示例代碼

創建test.go

package main

import (
    "fmt"
    "flag"
)

func main() {
    namePtr := flag.String("name", "username", "姓名")
    agePtr := flag.Int("age", 18, "年齡")
    musclePtr := flag.Bool("muscle", true, "是否有肌肉")

    var email string
    flag.StringVar(&email, "email", "chenqionghe@sina.com", "郵箱")


    flag.Parse()

    args := flag.Args()
    fmt.Println("name:", *namePtr)
    fmt.Println("age:", *agePtr)
    fmt.Println("muscle:", *musclePtr)
    fmt.Println("email:", email)
    fmt.Println("args:", args)
}

  

執行go buld后,建立test執行文件

./test -h

輸出

Usage of ./test:
  -age int
        年齡 (default 18)
  -email string
        郵箱 (default "chenqionghe@sina.com")
  -muscle
        是否有肌肉 (default true)
  -name string
        姓名 (default "username")

 

執行

./test -name 肌肉男 -age 20 -email muscle@muscle.com 哈哈 呵呵 嘿嘿

 輸出

name: 肌肉男
age: 20
muscle: true
email: muscle@muscle.com
args: [哈哈 呵呵 嘿嘿]

  

自定義flag

只要實現flag.Value接口即可

type Value interface {
  String() string
  Set(string) error
}

如下定義了一個Hello類型,實現了Value接口

//自定義解析參數,實現Set和String方法
type Hello string

func (p *Hello) Set(s string) error {
    v := fmt.Sprintf("Hello %v", s)
    *p = Hello(v)
    return nil
}

func (p *Hello) String() string {
    return fmt.Sprintf("%f", *p)
}

 

使用示例代碼  

package main

import (
    "fmt"
    "flag"
)


//自定義解析參數,實現Set和String方法
type Hello string

func (p *Hello) Set(s string) error {
    v := fmt.Sprintf("Hello %v", s)
    *p = Hello(v)
    return nil
}

func (p *Hello) String() string {
    return fmt.Sprintf("%f", *p)
}



func main() {
    namePtr := flag.String("name", "username", "姓名")
    agePtr := flag.Int("age", 18, "年齡")
    musclePtr := flag.Bool("muscle", true, "是否有肌肉")

    var email string
    flag.StringVar(&email, "email", "chenqionghe@sina.com", "郵箱")

    var hello Hello
    flag.Var(&hello, "hello", "hello參數")

    flag.Parse()
    others := flag.Args()
    fmt.Println("name:", *namePtr)
    fmt.Println("age:", *agePtr)
    fmt.Println("vip:", *musclePtr)
    fmt.Println("hello:", hello)
    fmt.Println("email:", email)
    fmt.Println("other:", others)
}

  

重新build后運行

./test -name 肌肉男 -age 20 -email muscle@muscle.com -hello 陳瓊和  哈哈 呵呵 嘿嘿

 輸出

name: 肌肉男
age: 20
vip: true
hello: Hello 陳瓊和
email: muscle@muscle.com
other: [哈哈 呵呵 嘿嘿]

  

就是這樣,Light weight baby !

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM