robert-min / handson-go

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

Chapter2. Sub command - Dead line #5

Open robert-min opened 1 year ago

robert-min commented 1 year ago

데드라인을 사용한 사용자 입력

robert-min commented 1 year ago

기본 main 동작

var totalDuration time.Duration = 5

func main() {
    allowedDuration := totalDuration * time.Second
    ctx, cancel := context.WithTimeout(context.Background(), allowedDuration)
    defer cancel()

    name, err := getNameContext(ctx)

    if err != nil && !errors.Is(err, context.DeadlineExceeded) {
        fmt.Fprintf(os.Stdout, "%v\n", err)
        os.Exit(1)
    }
    fmt.Fprintln(os.Stdout, name)
}
robert-min commented 1 year ago

go routine을 활용한 사용자 입력 확인

func getName(r io.Reader, w io.Writer) (string, error) {
    scanner := bufio.NewScanner(r)
    msg := "Your name please? Press the Enter key when done"
    fmt.Fprintln(w, msg)

    scanner.Scan()
    if err := scanner.Err(); err != nil {
        return "", err
    }
    name := scanner.Text()
    if len(name) == 0 {
        return "", errors.New("You entered an empty name")
    }
    return name, nil
}

func getNameContext(ctx context.Context) (string, error) {
    var err error
    name := "Default Name"
    c := make(chan error, 1)

    go func() {
        name, err = getName(os.Stdin, os.Stdout)
        c <- err
    }()

    select {
    case <-ctx.Done():
        return name, ctx.Err()
    case err := <-c:
        return name, err
    }
}