출처
Go로 MQTT를 테스트하던 중,
브로커 mosquitto를 사용할 때처럼 사용자가 명령어 옵션으로 포트번호와 아이디, 주제 등을 옵션으로 사용하여
해당 파일을 실행할 수 있을 거라는 아이디어를 얻어 Go언어의 명령행 인자에 대해 알아보게 되었다.
Go 언어에서 Command-Line Arguments는 프로그램이 실행될 때 명령줄에서 전달되는 인수들을 말한다.
이를 통해 프로그램에 다양한 입력을 제공할 수 있다.
예를 들어 go run hello.go의 경우 run 과 hello.go 를 go 프로그램의 명령행 인자로 사용하고 있다.
Go에서 Command-Line Arguments를 사용하는 방법은 매우 간단하다.
os 패키지의 os.Args를 사용한다.flag 패키지를 사용한다. 명령행 인수는 프로그램이 실행될 때 사용자로부터 입력을 받아 동적으로 동작을 변경할 수 있는 중요한 방법이다.
os.Args를 사용하면 간단하게 인수를 처리할 수 있으며,
더 구조화된 접근이 필요할 경우flag패키지를 활용하여 다양한 옵션과 설정을 관리할 수 있다.
이를 통해 프로그램의 유연성과 사용자 경험을 크게 향상시킬 수 있다.
package main
import (
"fmt"
"os"
)
func main() {
args := os.Args
fmt.Println("Program name:", args[0]) // 실행된 프로그램의 이름
fmt.Println("Arguments:", args[1:]) // 인수들
if len(args) > 1 {
fmt.Println("First argument:", args[1])
}
}
위 코드를 아래와 같이 실행하면
$ go run example.go hello world
출력 결과는 아래와 같다.
Program name: example.go
Arguments: [hello world]
First argument: hello
args[0]은 프로그램 이름을 나타낸다.args[1:]는 프로그램에 전달된 실제 인수들이다.os.Args는 Go의 os 패키지에서 제공하는 기능으로, 명령줄에서 프로그램에 전달된 인수들을 직접 접근할 수 있는 방법이다.
이는 프로그램이 시작될 때 전달된 모든 인수를 문자열 배열([]string) 형태로 제공한다.
strconv 패키지를 사용하여 이러한 변환을 쉽게 처리할 수 있다. (strconv.Atoi, strconv.ParseBool)
os.Args는 배열의 형태로, 첫 번째 요소인 os.Args[0]은 실행 파일의 이름 또는 경로이다.
os.Args는 문자열 배열([]string)로, 명령줄에서 전달된 모든 인수를 포함한다.
이 배열의 첫 번째 요소(os.Args[0])는 실행 파일의 이름이고, 그 이후의 요소들이 실제 인수들이다.
package main
import (
"fmt"
"os"
)
func main() {
args := os.Args
fmt.Println("Arguments:", args)
if len(args) > 1 {
fmt.Println("First argument:", args[1])
}
}
위의 프로그램을 example.go로 저장하고, 터미널에서 다음과 같이 실행한다고 가정하자.
go run example.go hello world
출력 결과는 아래와 같다.
Arguments: [example.go hello world]
First argument: hello
os.Args[0]에는 항상 프로그램의 이름 또는 경로가 들어 있다.flag 패키지는 Go 표준 라이브러리에서 제공하는 패키지로, 명령줄 인수를 더 구조화된 방식으로 처리할 수 있게 도와준다.
기본적인 데이터 타입에 대한 플래그 값을 정의하고, 자동으로 파싱할 수 있다.
flag 패키지를 사용하면 인수의 기본값 설정, 데이터 타입 변환, 자동 도움말 메시지 생성 등을 쉽게 구현할 수 있다.
flag 패키지는 인수를 파싱하는 데 있어 더 높은 유연성과 편리함을 제공한다.
package main
import (
"flag"
"fmt"
)
func main() {
name := flag.String("name", "World", "a name to say hello to")
age := flag.Int("age", 0, "your age")
flag.Parse()
fmt.Printf("Hello, %s! You are %d years old.\n", *name, *age)
}
flag.String(), flag.Int(), flag.Bool() 등: 각 데이터 타입에 대한 플래그를 정의flag.Parse(): 명령줄 인수를 실제 플래그로 파싱flag.Args(): 파싱되지 않은 인수들을 반환flag.Usage: 기본적으로 제공되는 도움말 메시지를 사용자 정의할 수 있다.파싱(Parsing): 어떤 페이지(문서, html 등)에서 내가 원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것
- 파서(Parser)는 컴파일의 일부로서, 원시 프로그램의 명령문이나 온라인 명령문, HTML 문서 등에서 Markup Tag 등을 입력으로 받아들여서 구문을 해석할 수 있는 단위와 여러 부분으로 분할해주는 역할을 한다.
- 이러한 파서(parser) 역할을 하는 컴퓨터가 구문 트리(parse tree)로 재구성하는 구문 분석 과정
go run example.go -name="Alice" -age=30
출력 결과는 아래와 같다.
Hello, Alice! You are 30 years old.





os.Args: 간단한 프로그램에서 빠르게 명령줄 인수를 처리하고 싶을 때 적합flag: 더 복잡한 명령줄 인수 파싱이 필요하거나 다양한 데이터 타입을 다뤄야 할 때 권장