GO语言实战 | 青训营笔记

69 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

课堂笔记

本堂课重点内容

循环判断语句的使用,流的操作

详细知识点介绍

GO中没有while语句,所以使用for+break的方式来实现while相应功能

读取的流的结构为字符串,并且带有回车,转换为数字时需要去掉回车,否则会报错

实践练习例子

猜谜游戏

规则介绍

在这个游戏里面 程序首先会生成一个0-100的随机整数提示玩家进行猜测

每次玩家需要输入一个数字

程序则会告诉玩家这个猜测的数字到底是高于还是低于那个秘密的随机数

并且让玩家再次猜测

如果猜对了的话 就告诉玩家胜利并且退出程序

操作步骤

生成随机数

使用math/rand中的包rand.Intn() 生成随机数不对劲,一直是81

     maxNum := 100
     secretNumber := rand.Intn(maxNum) //生成随机数
     fmt.Println("The secret is ", secretNumber)
 ​

进行修改后使用时间戳time生成随机数

     maxNum := 100
     rand.Seed(time.Now().UnixNano())
     secretNumber := rand.Intn(maxNum) //生成随机数
     fmt.Println("The secret is ", secretNumber)
 ​
实现用户的输入输出

使用Stdin输入流来进行用户输入数据的获取

并且使用简单的if判断用户输入的数据是否有误

  • 读取数据时先去掉流中的换行符
  • 再使用Atoi函数将读取到的数据流字符串转换为数字
     //用户输入
     fmt.Println("Please input your guess")
     reader := bufio.NewReader(os.Stdin)
     input, err := reader.ReadString('\n')
     if err != nil {
         fmt.Println("An error occured while reading input. Please try again", err)
         return
     }
     input = strings.Trim(input, "\r\n")
     
     guess, err := strconv.Atoi(input)
     if err != nil {
         fmt.Println("Invalid input. Please enter an integer value")
         return
     }
     fmt.Println("You guess is", guess)
 ​
 ​
实现判断逻辑

使用if-else if-else的方法来进行提醒用户输入的数据与真实值的差别

     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!")
     }
实现游戏循环

用户在猜测一次数据后就会退出,需要使用循环来进行循环猜想数据

在GO中没有while循环语句,所以在这里使用for循环语句来进行书写

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

整体实现

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

课后个人总结

本章容易混淆

与其他语言中的while相混淆

读取流的时候需进行去掉最后的回车