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