GoLang_Command Line Arguments

wldbs._.·2024년 10월 11일

GoLang

목록 보기
2/6
post-thumbnail

출처

Go로 MQTT를 테스트하던 중,
브로커 mosquitto를 사용할 때처럼 사용자가 명령어 옵션으로 포트번호와 아이디, 주제 등을 옵션으로 사용하여
해당 파일을 실행할 수 있을 거라는 아이디어를 얻어 Go언어의 명령행 인자에 대해 알아보게 되었다.


Command Line Arguments란?

Go 언어에서 Command-Line Arguments는 프로그램이 실행될 때 명령줄에서 전달되는 인수들을 말한다.
이를 통해 프로그램에 다양한 입력을 제공할 수 있다.

예를 들어 go run hello.go의 경우 runhello.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:]는 프로그램에 전달된 실제 인수들이다.


Args

os.Args는 Go의 os 패키지에서 제공하는 기능으로, 명령줄에서 프로그램에 전달된 인수들을 직접 접근할 수 있는 방법이다.
이는 프로그램이 시작될 때 전달된 모든 인수를 문자열 배열([]string) 형태로 제공한다.

  • 각 인자는 문자열 데이터로 취급
  • 만약 숫자나 불리언 값처럼 다른 타입으로 사용하려면, 적절한 변환을 통해 해당 타입으로 변환해야 한다!
    • Go에서는 strconv 패키지를 사용하여 이러한 변환을 쉽게 처리할 수 있다. (strconv.Atoi, strconv.ParseBool)

특징

  • os.Args배열의 형태로, 첫 번째 요소인 os.Args[0]은 실행 파일의 이름 또는 경로이다.
  • 그 이후의 요소들은 사용자가 프로그램에 전달한 실제 인수들이다.
  • 간단하고 빠르게 명령줄 인수를 다룰 수 있지만, 인수를 파싱하는 데 있어 유연성이 부족할 수 있다.


1. 기본 사용법

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])
    }
}

2. 실행 예시

위의 프로그램을 example.go로 저장하고, 터미널에서 다음과 같이 실행한다고 가정하자.

go run example.go hello world

출력 결과는 아래와 같다.

Arguments: [example.go hello world]
First argument: hello

3. 주요 포인트

  1. os.Args[0]에는 항상 프로그램의 이름 또는 경로가 들어 있다.
  2. 그 이후의 인수들은 순서대로 배열에 저장된다.


Flags

flag 패키지는 Go 표준 라이브러리에서 제공하는 패키지로, 명령줄 인수를 더 구조화된 방식으로 처리할 수 있게 도와준다.
기본적인 데이터 타입에 대한 플래그 값을 정의하고, 자동으로 파싱할 수 있다.
flag 패키지를 사용하면 인수의 기본값 설정, 데이터 타입 변환, 자동 도움말 메시지 생성 등을 쉽게 구현할 수 있다.

특징

  • flag 패키지는 인수를 파싱하는 데 있어 더 높은 유연성과 편리함을 제공한다.
  • 플래그의 기본값, 설명, 데이터 타입을 쉽게 설정할 수 있다.
  • 잘못된 플래그 형식이 입력되면 자동으로 도움말 메시지를 표시한다.


1. 기본 사용법

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)
}
  1. flag.String(), flag.Int(), flag.Bool() 등: 각 데이터 타입에 대한 플래그를 정의
  2. flag.Parse(): 명령줄 인수를 실제 플래그로 파싱
  3. flag.Args(): 파싱되지 않은 인수들을 반환
  4. flag.Usage: 기본적으로 제공되는 도움말 메시지를 사용자 정의할 수 있다.

파싱(Parsing): 어떤 페이지(문서, html 등)에서 내가 원하는 데이터를 특정 패턴이나 순서로 추출해 가공하는 것

  • 파서(Parser)는 컴파일의 일부로서, 원시 프로그램의 명령문이나 온라인 명령문, HTML 문서 등에서 Markup Tag 등을 입력으로 받아들여서 구문을 해석할 수 있는 단위와 여러 부분으로 분할해주는 역할을 한다.
  • 이러한 파서(parser) 역할을 하는 컴퓨터가 구문 트리(parse tree)로 재구성하는 구문 분석 과정

2. 실행 예시

go run example.go -name="Alice" -age=30

출력 결과는 아래와 같다.

Hello, Alice! You are 30 years old.


Arg vs Flag

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

0개의 댓글