GO语言工程实践课后作业:实现思路、代码以及路径记录 | 青训营

87 阅读3分钟

引言

本文章是在记录我完成猜谜游戏代码的过程。

初始版本的代码

屏幕截图 2023-08-24 063712.png

line1 导入main包

line3-6 导入fmt和math/rand

line8-12 限制随机数的最大数值为100,使用rand.Intn产生一个随机数。

但是我们会发现,每次出现的随机数都是同样的数字。

完整代码如下

package main  
  
import (  
"bufio"  
"fmt"  
"math/rand"  
"os"  
"strconv"  
"strings"  
"time"  
)  
  
func main() {  
maxNum := 100  
rand.Seed(time.Now().UnixNano())  
secretNumber := rand.Intn(maxNum)  
fmt.Println("The secret number is", secretNumber)  
  
fmt.Println("Please input your guess")  
reader := bufio.NewReader(os.Stdin)  
input, err := reader.ReadString('\n') //读取一行输入  
if err != nil {  
fmt.Println("An error occurred while reading input.Please try again", err)  
return  
}  
input = strings.TrimSuffix(input, "\n") //去掉换行符  
  
guess, err := strconv.Atoi(input) //转换成数字  
if err != nil {  
fmt.Println("Invalid input.Please enter an integer value")  
return  
}  
fmt.Println("your guess is", guess)  
}

完整思路如下:

line1

导入package包。

line3-11

导入fmt,os,strconv,math,rand等。

line13-17

line14规定了猜谜游戏的最大数字为100。 line15利用rand产生一个随机数,其中time的作用是为了利用时间戳来初始化随机数种子。如果没有时间戳,那么无论重复多少次,这个随机数始终唯一。

line19-25

line20输入你猜测的数字,os.Stdin是标准输入文件的指针。由于每个程序执行的时候都会打开几个文件,stdin,stdout,stderr等文件,只获取stdin文件就可以用os.Stdin来得到。line21ReadString结束在换行符号之前,是为了读取这一行的输入数字。如果程序在这一块报错,出现了"An error occurred while reading input.Please try again",那么程序在数据读取时出现了问题。

line26-32

line26由于你猜测的数字已经变成了字符串,那么我们在转换字符串为数字之前,需要去除末尾的换行符号。 line28将字符串转换为数字。 line30如果程序在这一块报错,出现了"Invalid input.Please enter an integer value",那么程序在数据转换时出现了问题,或者我们输入的数据是无效数据。

line33-34

如果跳出以上循环,则该程序没有问题,打印"your guess is"和猜测数字。

运行结果如下

The secret number is 12
Please input your guess
23
Invalid input.Please enter an integer value

Process finished with the exit code 0

路径记录

我的程序出现了"Invalid input.Please enter an integer value"。很明显,我的程序在数据转换时出现了问题。 同时GoLand提示我们:'Seed' is deprecated。经过查询之后,我们得知Seed has been deprecated in Go 1.20, but an alternative has existed since Go 1.0.也就是说GO已经不再支持seed用法。

为了解决转换问题,我又查询了其他版本的写法 我发现在line26 将input = strings.TrimSuffix(input, "\n")更改为input = strings.Trim(input, "\r\n")之后,这个转换问题就解决了。

原来\n是上一次输入产生缓冲的空格,是换行,即猜测数字的左空格。而\r是回车,也就是右空格。由于我们只顾左空格,忽略了右空格,才导致一直报错。