[go] Flag 패키지를 사용한 명령줄 플래그 처리의 다양한 활용 방법

Go 프로그래밍에서 명령줄 플래그 처리를 효율적으로 다루기 위해 flag 패키지를 사용할 수 있습니다. 이 포스트에서는 flag 패키지의 다양한 활용 방법을 살펴보겠습니다.

1. 기본적인 플래그 정의와 사용

flag 패키지를 이용하여 간단한 플래그를 정의하고 사용하는 방법은 다음과 같습니다:

package main

import (
	"flag"
	"fmt"
)

func main() {
	wordPtr := flag.String("word", "hello", "a string")
	numbPtr := flag.Int("numb", 42, "an int")
	boolPtr := flag.Bool("fork", false, "a bool")

	flag.Parse()

	fmt.Println("word:", *wordPtr)
	fmt.Println("numb:", *numbPtr)
	fmt.Println("fork:", *boolPtr)
}

위 코드에서 flag.String, flag.Int, flag.Bool 함수를 사용하여 각각 문자열, 정수, 부울형 타입의 플래그를 정의했습니다. 각 플래그의 이름, 기본값, 그리고 설명을 함수에 넘겨주었습니다. 그리고 flag.Parse를 호출하여 명령줄 인자를 파싱하고, 정의한 플래그 변수에 값을 설정했습니다.

2. 사용자 정의 플래그 타입

flag 패키지를 이용하여 사용자 정의한 타입을 가진 플래그를 다루는 경우에도 flag.Value 인터페이스를 구현하여 쉽게 처리할 수 있습니다.

예를 들어, 사용자 정의한 slice 타입을 가진 플래그를 다루는 예제를 살펴봅시다:

package main

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

type sliceValue []string

func (s *sliceValue) String() string {
	return fmt.Sprintf("%v", *s)
}

func (s *sliceValue) Set(value string) error {
	*s = strings.Split(value, ",")
	return nil
}

func main() {
	var s sliceValue
	flag.Var(&s, "slice", "input comma-separated list")

	flag.Parse()
	fmt.Println("slice:", s)
}

위 코드에서, sliceValue 구조체에 StringSet 메소드를 구현하여 flag.Value 인터페이스를 만족시켰습니다. 그리고 flag.Var 함수를 사용하여 사용자 정의한 타입을 가진 플래그를 정의했습니다.

3. 환경변수를 이용한 기본값 설정

flag 패키지를 이용하여 플래그의 기본값을 환경변수를 통해 설정하는 방법은 아래와 같이 가능합니다:

package main

import (
	"flag"
	"fmt"
	"os"
)

func main() {
	wordPtr := flag.String("word", os.Getenv("WORD_ENV"), "a string")

	flag.Parse()

	fmt.Println("word:", *wordPtr)
}

위의 코드에서 flag.String 함수의 기본값으로 os.Getenv를 이용하여 환경변수 값을 사용하도록 설정했습니다.

flag 패키지를 사용하여 명령줄 플래그를 처리하는 여러 방법에 대해 살펴보았습니다. 예시 및 자세한 정보는 공식 Go 문서를 참고하시기 바랍니다.

이상으로 Flag 패키지를 사용한 명령줄 플래그 처리의 다양한 활용 방법에 대한 포스트를 마치도록 하겠습니다. 감사합니다.