Go语言的数据输入常用方式
一.fmt包(Scanf Scanln Scan)
1.Scanf
这个和C语言的输入基本差不多,需要使用占位符
格式:
func main(){
var firstName,lastName string
fmt.Println("请输入您的姓名:")
fmt.Scanf("%s %s",&firstName,&lastName)//就可以实现一行输入
fmt.Println("您输入的名字是:", firstName+lastName)
}
2.Scanln
格式:
func main(){
var firstName,lastName string
fmt.Println("请输入您的姓名:")
fmt.Scanln(&firstName,&lastName)//就可以实现一行输入
fmt.Println("您输入的名字是:", firstName+lastName)
}
3.Scan(和Scanln的用法差不多)
格式:
func main(){
var firstName,lastName string
fmt.Println("请输入您的姓名:")
fmt.Scan(&firstName,&lastName)//就可以实现一行输入
fmt.Println("您输入的名字是:", firstName+lastName)
}
二.bufio包(ReadByte ReadBytes ReadLine ReadRune ReadString)
bufio包是对IO的封装,可以操作文件等内容,同样可以用来接收键盘的输入,此时对象不是文件,而是os.Stdin,也就是标准输入设备。
bufio包含了Reader、Writer、Scanner等对象,封装了很多对IO内容处理方法,但要从键盘输入,使用Reader对象(或Scanner对象)。
1.ReadString()方法
作用:读取数据直到分隔符"delim"第一次出现,并返回一个包含"delim"的字符串
如果 ReadString 在读取到“delim”前遇到错误,它返回已读字符串和那个错误(通常是 io.EOF)。只有当返回的字符串不以“delim”结尾时,ReadString 才返回非空 err。该方法原型如下:
func (b *Reader) ReadString(delim byte) (string, error)
其中,参数 delim 用于指定分割字节
代码示例:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
//创建一个reader对象
reader := bufio.NewReader(os.Stdin)
fmt.Println("请输入您的工作:")
//ReadString
work, err := reader.ReadString('\n')//返回的结果包含这个换行符
if err != nil {
fmt.Println("error occur...")
return
}
fmt.Println("您输入的工作是: ",work)//work是一个字符串形式
}
关于bufio包里函数的更多用法详见这个链接: c.biancheng.net/view/5569.h…
实例讲解:猜数游戏
内容介绍:
在这个游戏里面,程序首先会生成一个介于 1 到 100 之间的随机整数,然后提示玩家进行猜测。玩家每次输入一个数字,程序会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。
代码演示1(这个更好)
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
//1.生成随机数
maxNum := 100
//在这一行中,我们用系统时间戳来初始化随机数的种子。注意,这是一个必需操作,如果没有这行代码,将会出现每次运行产生的随机数是相同的数字的情况。
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum) //产生从1-100的一个随机数,将值赋值给secretNumber
//fmt.Println("The secret number is ", secretNumber) //声明了一个局部变量secretNumber,必须要在相同的代码块中使用它,所以要写输出这一行
//2.获取用户输入,可以使用标准库中的“bufio”
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
//加上for循环的目的
/*由于我们需要实现在用户成功猜出正确答案后程序退出,因此我们可以用先前介绍的for死循环来实现。
注意,由于我们是在循环中,所以先前讲述的遇到错误后return需要替换为continue,避免程序意外退出。
*/
for {
input, err := reader.ReadString('\n') ////返回的结果包含这个换行符
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
input = strings.Trim(input, "\r\n") //去掉换行符
guess, err := strconv.Atoi(input) //将字符串转换为int
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You guess is", guess)
if guess > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Please try again")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!")
break
}
}
}
代码演示2
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
//设置一个最大值
maxNum := 100
//随机生成一个数,并且其最大数为100
//注意:在生成随机数之前,需要在rand.seed()中放入时间戳,不然会使随机数始终是一样的
rand.Seed(time.Now().UnixNano())
//生成一个随机数
random := rand.Intn(maxNum)
//使用for死循环
var val int
for {
fmt.Println("请输入您猜测的数字:")
//输入数字,这个也是需要改进的地方
fmt.Scanf("%d\n", &val)
if val < random {
fmt.Println("您猜测的数字太小了,请重新猜测:")
} else if val > random {
fmt.Println("您猜测的数字太大了,请重新猜测:")
} else {
//猜测成功
fmt.Println("恭喜您,猜测成功!")
break
}
}
}