GO语言命令行输入函数

96 阅读2分钟

本文只讲scanf、scan、scanln这三个函数因为我现在只用到了这些 过来记录一下

Scanf

package main

import "fmt"

func main() {
    var name string
    var password string
    
    fmt.Printf("请输入name||password: ")
    
    // Scanf返回值 n: 成功数、err:
    s, err := fmt.Scanf("%s %s", &name, &password)
    if err != nil {
       fmt.Println(err)
    }
    
    fmt.Println("成功输入个数: ", s)
    
    fmt.Printf("name: %s - password: %s", name, password)
}

这两种写法都一样,Scanf不可以把名字和密码分两行输入

输出结果

请输入name||password: 123 321
成功输入个数:  2
name: 123 - password: 321

Scan

和scanf差不多,都有两个返回值,一个读取成功个数,另一个错误值
如果需要分行输入可以用scan函数,实现如下

package main

import "fmt"

func main() {
    var name string
    var password string
    fmt.Println("请依次输入name、password")
    // Scan返回值 n: 成功数、err:
    s, err := fmt.Scan(&name, &password)
    if err != nil {
       fmt.Println(err)
    }
    /*
    效果同上
    n, err := fmt.Scan(&name)
    n, err := fmt.Scan(&password)
    */
    
    fmt.Println("成功输入个数: ", s)
    
    fmt.Printf("name: %s - password: %s", name, password)
}

运行结果

请依次输入name、password
123
321
成功输入个数:  2
name: 123 - password: 321

Scanln

Scanln又不同了

package main

import "fmt"

func main() {
    var name string
    var password string
    
    fmt.Println(">>> Scanln(n,p) <<<")
    
    // Scan返回值 n: 成功数、err:
    s, err := fmt.Scanln(&name, &password) // 这个写法name、password必须写在一行
    if err != nil {
       fmt.Println(err)
    }

    fmt.Println(">>> Scanln(n) <<<")
    
    // 这样可以分行输入
    s, err = fmt.Scanln(&name)
    
    fmt.Println(">>> Scanln(p) <<<")
    
    s, err = fmt.Scanln(&password)

    fmt.Println("成功输入个数: ", s)
    
    fmt.Printf("name: %s - password: %s", name, password)
}

运行结果

>>> Scanln(n,p) <<<
123 321
>>> Scanln(n) <<<
123
>>> Scanln(p) <<<
321
成功输入个数:  1
name: 123 - password: 321

总结

Scanf: 按照给定的格式依次读取数据(包括非法数据)不能换行输入(如果要换行需要在前面加一个scanln吸收掉回车符, 就像c语言中的getchar) Scan: 比Scanf高级, 依次读取数据, 遇到回车会忽略, 可以换行输入(如果要先用了Scan输入, 再用Scanf输入的话, 需要在中间加一个Scanln) Scanln:类似Scan,但是遇到换行、回车,立马结束输入,如果要换行输入须用多个Scanln