Humanity

Edit the world by your favorite way

Go のオプション引数で -v -v -v みたいに複数指定する方法

mattn さんに教えてもらった。 いつもお世話になってて感謝しかない。

-d dir1 -d dir2 みたいな引数を持つオプションを複数指定する方法

package main

import "flag"
import "strings"

type myDog []string

func (dog *myDog) String() string {
    return strings.Join(([]string)(*dog), ",")
}

func (dog *myDog) Set(value string) error {
    *dog = append(*dog, value)
    return nil
}

func main() {
    var dog myDog
    flag.Var(&dog, "dog", "犬")
    flag.Parse()
}

-v -v -v みたいな引数を持たないオプションを複数指定する方法

package main

import (
    "flag"
    "fmt"
)

type myDog []bool

func (dog *myDog) String() string {
    return fmt.Sprint(([]bool)(*dog))
}

func (dog *myDog) Set(value string) error {
    *dog = append(*dog, true)
    return nil
}

func (dog *myDog) IsBoolFlag() bool {
    return true
}

func main() {
    var dog myDog
    flag.Var(&dog, "v", "犬")
    flag.Parse()
    fmt.Printf("%d dog\n", len(dog))
}

Go は type で既存の型を特別な型として定義してメソッド生やせたりするのが面白いですね。