구리의 창고

Golang - 인자(Argument, Parameter) 파싱하기 FlagSet 본문

Golang

Golang - 인자(Argument, Parameter) 파싱하기 FlagSet

구리z 2017. 7. 27. 11:38

소개

Golang에서는 기본으로 넘겨받은 인자를 파싱하는 패키지가 포함되어있다. 이 중 Command Line을 파싱하는 오픈소스는 굉장히 많이 있다. 주로 사용하는걸 하나 추천하면 urfave/cli가 있다. 하지만 Command Line이 아닌 사용자로부터 입력받아 문자열을 파싱하려면 약간의 꼼수가 필요하다. 이를 가능하게 해주는 것이 FlagSet이다.

Flag

FlagSet을 살펴보기 전에 기본 예제로 나와있는 Flag 사용법을 살짝 살펴보자.
package main

import (
        "flag"
        "fmt"
)

func main() {
        foo := flag.String("foo", "foo", "a string")

        flag.Parse()

        fmt.Println("foo: ", *foo)
}
위 예제에서는 프로그램 실행 시 -foo, --foo가 설정되어 있으면 그 값을 foo 변수에 넣어준다.

FlagSet

Flag는 기본적으로 CommandLine과 동작하므로, 변수로 들고있는 문자열에는 사용 할 수 없다. 한 가지 예로, Slack 봇을 만드는데 사용자가 입력한 문자열을 파싱해야 한다고 생각해보자. 이 경우는 os.Args를 통해 동작하지 않는다. 다음 코드를 보자.
package main

import (
        "flag"
        "fmt"
        "strings"
)

func main() {
        text := "-foo foo bar"
        params := strings.Split(text, " ")

        f := flag.NewFlagSet("", flag.ContinueOnError)
        foo := f.String("foo", "", "a string")

        err := f.Parse(params)

        if err != nil {
                fmt.Printf("%+v\n", err)
        }

        fmt.Println("foo: ", *foo)
        fmt.Println("args: ", f.Args())
}
사용자가 인자로 -foo foo bar를 입력한 경우이다. 하나의 FlagSet을 만들고 그 안에 Flag들을 설정해준다. Flag로 설정되지 않은 값들은 f.Args()로 알아 낼 수 있다.


0 Comments
댓글쓰기 폼