Open robert-min opened 1 year ago
flag.NewFlagSet()
: FlagSet 커맨드 라인 어플리케이션의 인수 처리를 위한 추상 객체 생성fs.Parse()
: 함수 수행 도중 오류가 발생하는 경우 어떻게 처리할지 설정
ContinueOnError
옵션 : Parse 함수에서 nil 외의 오류가 반환되도라도 프로그램을 계속 실행, 파싱 에러를 직접 처리할 대 유용ExitOnError
옵션 : 오류 발생 시 프로그램을 종류PanicOnError
옵션 : 프로그램 종료시 Panic() 함수를 호출, 프로그램 종류 전 recover 함수를 사용하여 마무리 정리 작업이 가능SetOutPut()
: NewFlagSet() 함수를 사용하여 생성된 FlagSet 객체의 진단 메시지 또는 출력 메시지를 작성하는 데 사용할 writer 지정IntVar()
: int 타입의 값을 받을 수 있는 옵션 생성
fs.NArgs()
: 플래그 옵션이 파싱된 이후에 주어진 위치 인수의 개수를 반환type config struct {
numTimes int
}
func parseArgs(w io.Writer, args []string) (config, error) {
c := config{}
// create FlagSet object
fs := flag.NewFlagSet("greater", flag.ContinueOnError)
fs.SetOutput(w)
// set flag options
fs.IntVar(&c.numTimes, "n", 0, "Number of times to great")
err := fs.Parse(args)
if err != nil {
return c, err
}
if fs.NArg() != 0 {
return c, errors.New("Positional arguments specified")
}
return c, nil
}
사용자가 직접 정의하려면 Usage 속성값에 함수를 정의해서 사용
// set help message
fs.Usage = func() {
var usageString = `
A greeter application which prints the name you entered a specified number of times.
Usage of %s: <options> [name]`
fmt.Fprintf(w, usageString, fs.Name())
fmt.Fprintln(w)
fmt.Fprintln(w)
fmt.Fprintln(w, "Options: ")
fs.PrintDefaults()
}
type config struct {
numTimes int
name string
}
// 입력값을 파싱하는 함수
func parseArgs(w io.Writer, args []string) (config, error) {
c := config{}
// create FlagSet object
fs := flag.NewFlagSet("greater", flag.ContinueOnError)
fs.SetOutput(w)
// set help message
fs.Usage = func() {
var usageString = `
A greeter application which prints the name you entered a specified number of times.
Usage of %s: <options> [name]`
fmt.Fprintf(w, usageString, fs.Name())
fmt.Fprintln(w)
fmt.Fprintln(w)
fmt.Fprintln(w, "Options: ")
fs.PrintDefaults()
}
// set flag options
fs.IntVar(&c.numTimes, "n", 0, "Number of times to great")
err := fs.Parse(args)
if err != nil {
return c, err
}
if fs.NArg() > 1 {
return c, errInvalidPosArgSpecified
}
if fs.NArg() == 1 {
c.name = fs.Arg(0)
}
return c, nil
}
func runCmd(rd io.Reader, w io.Writer, c config) error {
var err error
// Enter if name is not specified or blank
if len(c.name) == 0 {
c.name, err = getName(rd, w)
if err != nil {
return err
}
greetUser(c, w)
return nil
}
greetUser(c, w)
return nil
}
Flag package
-n
으로 넘기는 값만큼 사용자의 이름을 출력하도록 어플리케이션 작성사용자 인터페이스 개선