scanscanscan
基本语法
scan
func Scan(a ...interface{}) (n int, err error)
anerr
下面是一个简单的例子,演示如何从控制台中读取两个整数:
func main() { var a, b int fmt.Print("请输入两个整数:") n, err := fmt.Scan(&a, &b) if err != nil { fmt.Println(err) return } fmt.Printf("成功读取了 %d 个参数:%v\n", n, []int{a, b}) }
Scanab
scan的特性
Scan
1. 忽略空格
Scan
func main() { var a, b, c string fmt.Print("请输入三个字符串:") n, err := fmt.Scan(&a, &b, &c) if err != nil { fmt.Println(err) return } fmt.Printf("成功读取了 %d 个参数:%v\n", n, []string{a, b, c}) }
hello world go
2. 等待回车
Scan\n
func main() { var s string fmt.Print("请输入一个字符串:") n, err := fmt.Scan(&s) if err != nil { fmt.Println(err) return } fmt.Printf("成功读取了 %d 个参数:%v\n", n, s) }
hello\n
3. 不会读取换行符
Scan\nScan\n
func main() { var s string fmt.Print("请输入一个字符串:") n, err := fmt.Scan(&s) if err != nil { fmt.Println(err) return } fmt.Printf("成功读取了 %d 个参数:%v\n", n, s) }
hello\nworldhello\n
深入分析
ScanfmtScanfScanf
1. 格式化输入
Scanf
func main() { var a int var b string fmt.Print("请输入一个整数和一个字符串:") n, err := fmt.Scanf("%d %s", &a, &b) if err != nil { fmt.Println(err) return } fmt.Printf("成功读取了 %d 个参数:%v\n", n, []interface{}{a, b}) }
"%d %s"
2. 自定义分隔符
ScanfScanfScanfScanState
func main() { var a, b string fmt.Print("请输入两个字符串,用逗号分隔:") s := bufio.NewScanner(os.Stdin) s.Split(func(data []byte, atEOF bool) (adv int, token []byte, err error) { for i := 0; i < len(data); i++ { if data[i] == ',' { return i + 1, data[:i], nil } } return 0, data, bufio.ErrFinalToken }) if s.Scan() { a = s.Text() } if s.Scan() { b = s.Text() } fmt.Printf("您输入的字符串是:%v\n", []string{a, b}) }
bufioNewScannerScannerSplitab
总结
ScanScan\nScanf