PHpullh
학습 라이브러리/Go/CLI 도구 패턴

GO · 패턴

CLI 도구 패턴

flag 패키지와 서브커맨드 패턴으로 CLI 도구를 구현합니다.

패턴고급cliflagsubcommandtool

핵심 설명

flag 패키지와 서브커맨드 패턴으로 CLI 도구를 구현합니다.

Go code

package main

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

type Command struct {
	Name string
	Desc string
	Run  func(args []string) error
}

func main() {
	commands := map[string]*Command{
		"serve": {Name: "serve", Desc: "서버 시작",
			Run: func(args []string) error {
				fs := flag.NewFlagSet("serve", flag.ExitOnError)
				port := fs.Int("port", 8080, "포트 번호")
				fs.Parse(args)
				fmt.Printf("서버 시작: :%d\n", *port)
				return nil
			}},
		"migrate": {Name: "migrate", Desc: "DB 마이그레이션",
			Run: func(args []string) error {
				fs := flag.NewFlagSet("migrate", flag.ExitOnError)
				dir := fs.String("dir", "up", "방향 (up/down)")
				fs.Parse(args)
				fmt.Printf("마이그레이션: %s\n", *dir)
				return nil
			}},
	}

	if len(os.Args) < 2 {
		fmt.Println("사용법: app <command> [options]")
		for _, cmd := range commands {
			fmt.Printf("  %-10s %s\n", cmd.Name, cmd.Desc)
		}
		os.Exit(1)
	}

	cmd, ok := commands[os.Args[1]]
	if !ok {
		fmt.Fprintf(os.Stderr, "알 수 없는 명령: %s\n", os.Args[1])
		os.Exit(1)
	}
	if err := cmd.Run(os.Args[2:]); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}

학습 팁

실무에서는 cobra 라이브러리가 서브커맨드, 자동완성, 도움말 생성 등을 제공합니다.

주의할 점

os.Exitdefer를 실행하지 않습니다. 정리 작업이 필요하면 os.Exit 전에 수행하세요.

자주 묻는 질문

CLI 도구 패턴란 무엇인가요?

flag 패키지와 서브커맨드 패턴으로 CLI 도구를 구현합니다.

CLI 도구 패턴 학습 시 주의할 점은 무엇인가요?

os.Exit 은 defer 를 실행하지 않습니다. 정리 작업이 필요하면 os.Exit 전에 수행하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.