go语言实战第一天:猜字谜小游戏

68 阅读3分钟

前言:

首先呢,作者本人是一个有关go语言的初学者,有些代码细节可能还是理解不到位,如有错误之处欢迎大家指出,当然作者希望大家不喜勿喷,嘴上多多留情哈,谢谢!

那么接下来我就不废话了,我本人呢,学习go用的编译器是goland(这里小小的吐槽一下:这个编译器感觉不太聪明的样子)下面是正文哈

源码如下:

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 secretNumber is ", secretNumber)  
fmt.Println("Please input your guess?")  
reader := bufio.NewReader(os.Stdin)  
for {  
input, err := reader.ReadString('\n')  
if err != nil {  
fmt.Println("Please try again")  
continue  
}  
input = strings.TrimSuffix(input, "\r\n")  
guess, err := strconv.Atoi(input)  
if err != nil {  
fmt.Println("Please input a number of int rather than the other!Please try again")  
continue  
}  
fmt.Println("your guess is ", guess)  
if guess > secretNumber {  
fmt.Println("your guess is bigger than this number,Please try again")  
} else if guess < secretNumber {  
fmt.Println("your guess is smaller than this number,Please try again")  
} else {  
fmt.Println("恭喜你,猜中了!")  
break  
}  
}  
}

有关代码详解:

首先声明一句,如果你也是像我一样一个一个字母手敲的话,那个import 部分就不用敲了。在goland里面你在使用头文件下的有关函数时它会自己添加相应的import内容。

然后我们从这个rand.Seed(time.Now().UnixNano()) 开始讲吧。首先,rand.Seed() 这个函数是为了使每次运行时得到的随机数均不相同,一般呢是会选择用当前时间戳作为Seed()的value值。

然后这个rand.Int则是为了每次运行可获取到不同的int类型值放进secretNumber里面,然后这个rand.Int() 里面的参数MaxNumber就是限制它随机数最大不能超过这个值。

然后reader := bufio.NewReader(os.Stdin) 这一行呢就是用来整行从键盘读取数据用的。

reader.ReadString这个函数就是从键盘读取string类型的数据,()里面的参数'\n'就是此次读取以'\n'换行符为读取终止的条件。

strings.TrimSuffix这个函数呢,就是帮助你的第一个参数从尾部去掉第二个参数,这里注意两个参数都是string类型的哈。

那这里肯定会有人要问了,那你读取的时候是以'\n'为结束符的,为啥子从尾部去掉东西的时候要多去掉一个"\r"呢,这个"\r"又是从哪里蹦出来的呢?

哈哈哈,家人们呐!这就是goland这个编译器的独到之处啦(主要是我不敢明着骂,毕竟不是谁都敢像张雪峰那样接一封律师函,本人胆小,还不敢打官司)。那么在goland里面呢,在进行读取数据的操作时,它会默认以 '\n' 结尾的读取操作在进行赋值给string内部时会以 "\r\n" 为换行符进行记录(我没有故意抹黑的意思,别举报我,谢谢)。

这个怎么说呢,不能说多此一举,只能说确实没啥用,反正都要去掉的,写代码的时候还得多写一个 "\r" ,嗯,真好。

这个后面的我想我就不用说了吧,大家懂的都懂,就有点底子的也都看得懂我写的啥吧?那我就不多讲了,各位看官,再见喽!