一、输入
1、fmt.Scan
情况1:
//1
var name string //定义空字符串""
fmt.Println("请输入姓名:")
fmt.Scan(&name) //将终端输入的文本存储到name所指向的内存地址
fmt.Println(name)
情况2:
//2
var name string
var age int
fmt.Println("请输入姓名和年龄:")
count, err := fmt.Scan(&name, &age)
if err == nil {
fmt.Println(count, err)
fmt.Println(name, age)
} else {
fmt.Println("输入错误", nil)
}
//
请输入姓名和年龄:
golang
20
2 <nil>
golang 20
Process finished with the exit code 0
fmt.Scan()函数返回两个值:
1、count: 记录输入正确的个数
2、err: 记录输入错误的信息
fmt.Scan()的特点:
如果在函数中传入多个引用变量,子终端中没有输入完的话,终端会一直等待,如下:
2、fmt.Scanln
功能与上面的fmt.Scan一样。唯一的区别在于,当在要求输入多个值时,如果只输入其中的一部分,然后回车后,终端不会再等待输入,如下
var name string
var age int
fmt.Println("请输入姓名和年龄:")
count, err := fmt.Scanln(&name, &age)
if err == nil {
fmt.Println(name, age)
} else {
fmt.Println("输入错误", nil)
}
fmt.Println(count, err)
//
请输入姓名和年龄:
go
输入错误 <nil>
1 unexpected newline
Process finished with the exit code 0
3、fmt.Scanf
以指定的格式输入,如下,会出输入中提取出姓名
var name string
fmt.Println("请输入姓名:")
fmt.Scanf("我的姓名是%s", &name)
fmt.Println(name)
//
请输入姓名:
我的姓名是go
go
Process finished with the exit code 0
4、fmt 输入函数存在的问题
如下:如果在输入的一行中有空格存在,那么回车后只能提取到第一个空格前的字符
var message string
fmt.Println("请输入消息:")
fmt.Scanln(&message)
fmt.Println(message)
//
请输入消息:
开始了的访客数量大幅减少开发商 十六点JFK斯洛伐克时间
开始了的访客数量大幅减少开发商
Process finished with the exit code 0
5、解决fmt输入的问题
通过读取os模块下的Stdin标准输入模块(终端中输入的内容都在此模块下)获取一行有空格的值。
ReadLine()返回三个参数:
line:从stdin中读取一行的数据,类型为字节集合
isPrefix:
reader默认一次能4096个字节
如果通过reader一次性读完,isPrefix=false
如果先读一部分,isPrefix=true,证明还有内容未读,直到读完的一瞬间isPrefix=false
err:输入时出错错误的信息
代码中的下划线:在go中声明了的变量未使用的话会报错,在代码中reader.ReadLine()会返回三个值、而我们这里只用到了line值、至于isPrefix, err没有用到,所以我们不需要声明。直接用_代替即可,如果声明不用则会报错
reader := bufio.NewReader(os.Stdin)
line, _, _ := reader.ReadLine()
data := string(line)
fmt.Println(data)
//
发生了的开发建设离开 啊士大夫艰苦拉萨大家发 就发送大量福克斯点击发送
发生了的开发建设离开 啊士大夫艰苦拉萨大家发 就发送大量福克斯点击发送
Process finished with the exit code 0