Undefined Title

Undefined Title

Go言語 コマンドラインオプション解析

flag packageを使う。

オプション定義には次の2つの形式が型それぞれにある。

  • ポインタを返す形式 ex) flag.String, flag.Float64
  • ポインタを指定する形式 ex) flag.BoolVar, flag.IntVar

Value interfaceを使って独自の解析もできる。

ぱっと見出来なさそうなのが、ひとつのオプションに対してshort/longを両方を提供すること。 例えばsilent modeを--silent-sどちらでも有効にする、みたいな。 できるのかな?

package main

import (
  "flag"
  "fmt"
  "os"
  "strings"
  "time"
)

type MyValue struct {
  vals []string
}

func (v *MyValue) String() string {
  return ""
}
func (v *MyValue) Set(e string) error {
  v.vals = strings.Split(e, ",")
  return nil
}

var silent bool
var name *string
var age int
var tall *float64
var hours time.Duration
var myVal MyValue

func init() {
  flag.BoolVar(&silent,    "silent", false,       "silent mode")
  name = flag.String(      "name",   "taro",      "your name")
  flag.IntVar(&age,        "age",    24,          "")
  tall = flag.Float64(     "tall",   172.5,       "tall")
  flag.DurationVar(&hours, "hours",  5*time.Hour, "")
  flag.Var(&myVal,         "my-value",     "comma separated values e.g) --attr=1,a,3")
}

func main() {
  if len(os.Args) == 1 {
    flag.PrintDefaults()
    os.Exit(1)
  }
  flag.Parse()

  fmt.Println(flag.Args())
  fmt.Println("--")
  fmt.Println("NArg()", flag.NArg())
  fmt.Println("NFlag()", flag.NFlag())

  fmt.Println("--")
  fmt.Println("silent", silent)
  fmt.Println("name",   *name)
  fmt.Println("age",    age)
  fmt.Println("tall",   *tall)
  fmt.Println("hours",  hours)
  fmt.Println("myVal",  myVal)
}