对于 golang 编程面试中的以下类型的输入,获取输入的最佳方式是什么?
输入:
3 hello elloh test estt tier riet
我发现了两种方法:
方法一:
reader := bufio.newreader(os.stdin) var lines []string for { line,err := reader.readstring('n') //this reads only one read if err != nil { log.fatal(err) } if len(strings.trimspace(line)) == 0 { break } line_s := strings.split(line, " ") lines = append(lines, line_s...) }
方法2:
bytes, err := ioutil.ReadAll(os.Stdin) fmt.Println(len(bytes)) if err == nil { input := strings.Split(string(bytes), "n") count, _ := strconv.Atoi(input[0]) fmt.Println(input) var lines []string for i := 1; i < count; i++ { line := strings.Split(input[i], " ") lines = append(lines, line...) } fmt.Println(lines) }
但不确定如何结束从 method2 中的 stdin 获取输入。
请建议获取输入的最佳方法。
使用 bufio.scanner
读取输入。使用函数来封装复杂性和实现细节。例如,
package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func readdata(s *bufio.scanner) ([][]string, error) { var data [][]string if !s.scan() { return nil, s.err() } nline, err := strconv.atoi(strings.trimspace(s.text())) if err != nil { return nil, err } for ; nline > 0 && s.scan(); nline-- { data = append(data, strings.fields(s.text())) } if err := s.err(); err != nil { return nil, err } if nline != 0 { err := fmt.errorf("missing %d lines of data", nline) return nil, err } return data, nil } func main() { s := bufio.newscanner(os.stdin) data, err := readdata(s) if err != nil { fmt.fprintln(os.stderr, err) os.exit(1) } fmt.println(len(data)) for _, datum := range data { fmt.println(datum) } }
https://go.dev/play/p/0xwp3-hwgyk
3 hello elloh test estt tier riet 3 [hello elloh] [test estt] [tier riet]