go语言学习之读取用户输入 | 青训营 ;

262 阅读3分钟

Go语言的数据输入常用方式

一.fmt包(Scanf Scanln Scan)

1.Scanf

这个和C语言的输入基本差不多,需要使用占位符

5.png

格式:

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
                }
        }
}