robert-min / handson-go

Go-lang hands on guide
0 stars 0 forks source link

Chapter1. Command line application flag package #2

Open robert-min opened 1 year ago

robert-min commented 1 year ago

Flag package

사용자 인터페이스 개선

robert-min commented 1 year ago

입력값을 파싱하는 함수

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
}
robert-min commented 1 year ago

도움말 사용법 메시지를 사용자가 직접 정의

robert-min commented 1 year ago

위치 인수를 통해 사용자의 이름을 받을 수 있도록 설정

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
}