1. Command Line Argument 사용
Go 프로그램의 main() 함수는 C,C# 등의 다른 언어에서 갖고 있는 argument 파라미터를 갖지 않는다. 따라서, Command Line의 Argument를 얻기 위해서는 os.Args 를 사용해야 한다.
os.Args 는 다음과 같이 문자열 슬라이스로 정의되어 있는데, Args는 프로그램의 Command Line 정보를 프로그래명부터 순서대로 담고 있다.
var Args []string
프로그램이 2개의 argument를 가진다고 가정했을 때, os.Args[0:1]는 실행되는 Go 프로그램 이름을 가지며, os.Args[1:2]는 첫번째 argument를, os.Args[2:3]는 두번째 argument를 갖는다. 아래 예제는 프로그래명과 2개의 Command Line argument를 출력하는 샘플이다.
package main import ("fmt"; "os") func main() { if len(os.Args) < 2 { panic("에러: 2개 미만의 argument") } programName := os.Args[0:1] firstArg := os.Args[1:2] secondArg := os.Args[2:3] allArgs := os.Args[1:] fmt.Println(programName, firstArg, secondArg) }
2. Command Line Flag 사용
위의 Command Line Args 기능에서 한발 나아가 Go는 흔히 사용되는 Command Line 옵션(예:-h, -input 등)을 파싱하는 기능을 제공한다. Command Line Flag라 불리우는 이 기능은 "flag" 표준패키지에서 제공한다.
flag는 문자열, 정수, 그리고 Boolean 3가지 데이타타입을 지원하는데, 각각 flag.String(), flag.Int(), flag.Bool() 같은 메서드를 사용하여 Command 옵션을 지정할 수 있다. Command 옵션을 지정하는 플래그 메서드는 플래그명, 디폴트값, 그리고 간단한 플래그 도움말 등을 받아들이는데, 예를 들어, flag.String(플래그명, 디폴트값, 플래그 설명) 과 같은 형태이다. 모든 옵션이 정의된 후, flag.Parse() 호출하는데, 이는 실제 Command Line 옵션들을 파싱해서 읽어들여 (포인터)변수에 저장하는 역활을 한다. 포인터 변수에 저장된 데이타는 Dereference하여 사용하면 된다. 아래 예제는 -file, -maxtrial, -root 라는 3가지 옵션 플래그를 읽고 그대로 출력해보는 코드이다.
/* test.go */ package main import ( "flag" "fmt" ) func main() { file := flag.String("file", "default.txt", "Input file") trials := flag.Int("maxtrial", 10, "Max Trial Count") isroot := flag.Bool("root", false, "Run as root") flag.Parse() // 포인터 변수이므로 앞에 * 를 붙어 deference 해야 fmt.Println(*file, *trials, *isroot) } /* 테스트 C> go build test.go C> test -file=test.csv -maxtrial=5 -root=true test.csv 5 true */
flag에 기본적으로 내장된 옵션으로 -h 혹은 --help 옵션이 있다. 즉, 사용자가 test --help 처럼 실행하면, 등록된 모든 플래그 옵션들을 플래그 도움말(플래그 정의시 개발자가 지정한 도움말)과 함께 화면에 출력해 준다.
C> test --help Usage of test: -file string Input file (default "default.txt") -maxtrial int Max Trial Count (default 10) -root Run as root