零基础学习Go的Day05| 青训营笔记

86 阅读3分钟

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

1.复习已学知识

  • Go中定义变量,使用var进行定义变量,const用于定义常量,go支持类型自动推断,:=定义变量的简洁写法
  • Go中使用if else,不需要加()
  • Go中使用循环,只存在for这一种循环语句
  • Go中switch语句,不需要加break,Go中case不存在穿透性这点跟Java不一样!支持任意类型
  • Go中使用数组,真实开发场景很少使用数组,因为他的长度固定,使用Go中的切片进行替代
  • Go中使用切片,使用make创建切片,使用跟数组一样,可以使用copy()拷贝A切片到B切片
  • Go中map,实际开发中使用最频繁的数据结构,在Java中叫HashMap,使用make创建map,需要指定俩个类型,第一个指定是key的类型,第二个指定的是value的类型,使用[]语法进行存取值,使用delete删除map中的元素,使用ok判断元素是否存在,Go中map是无序的
  • Go中range,切片和map可以使用range进行快速的遍历
  • Go中函数,也就是Java中的方法
  • Go中指针,用于对常用参数的修改
  • Go中结构体,有点像Java定义对象的感觉
  • Go中结构体方法,定义分为带指针和不带指针,带指针可以对值进行修改
  • Go中错误的处理,可以在函数中定义error参数表示这个函数可能会发生错误并进行处理
  • Go中对字符串的操作,在strings包下拥有许多对字符串的操作函数,字符串格式化,在标注库的fmt包下有许多字符串格式化的方法
  • Go中JSON处理,需要保证结构体中每一个字段的第一个字母大写,也就是Go中的公开字段,这样定义的结构体就可以使用json.Marshal()进行序列化,使用json.Unmarshal()进行反序列化到一个空的变量中,在结构体中在定义字段的类型后面加上json:"字段名"就可以自定义json具体的返回名,类似于SpringBoot框架中Jackson的@JsonProperty的用法
  • Go中时间的处理,使用标注库中的time库,time.now()快速获取当前时间,time.Date()构建一个自定义带时区的时间,通过.Year()获取年、.Month()获取月、.Day()获取天、.Hour()获取时、.Minute()获取分,使用.sub()可以对俩个时间进行相减得到相差的时间,使用.Format("2006-01-02 15:04:05")进行时间格式化,使用.Unix()获取时间的时间戳
  • Go中对数字的解析,引入strconv库,strconv.ParseFloat()格式化为浮点数,strconv.ParseInt()格式化为整数
  • Go中获取进程信息

观看走进Go语言基础语言的课程

Go实现猜字游戏

v1版本

package main

import (
   "fmt"
   "math/rand"
)

/*
*

   获取随机数v1,你会发现每次都是一样的数字这是为什么?
*/
func main() {
   maxNum := 100
   /**
   math/rand包存在一个Intn方法
   Intn 作为 int 从默认 Source 返回半开区间 [0,n) 中的非负伪随机数。如果 n <= 0,它会恐慌
   */
   secretNumber := rand.Intn(maxNum)
   fmt.Println("The secret number is ", secretNumber)
}

v2版本

package main

import (
   "fmt"
   "math/rand"
   "time"
)

/*
*
   获取随机数v2,通过给rand设置随机数种子从而真正实现了随机数字的生成
*/
func main() {
   maxNum := 100
   /**
   如果不给rand设置一个随机树种子它每次都会生成相同的数字,我们通常会使用当前时间戳作为随机数种子
   Seed 使用提供的种子值将默认 Source 初始化为确定性状态。
   如果未调用 Seed,则生成器的行为就像由 Seed(1) 播种一样。除以 2³¹-1 时具有相同余数的种子值生成相同的伪随机序列。
   与 Rand.Seed 方法不同,Seed 对于并发使用是安全的
   */
   rand.Seed(time.Now().UnixNano())
   secretNumber := rand.Intn(maxNum)
   fmt.Println("The secret number is ", secretNumber)
}

v3版本

package main

import (
   "bufio"
   "fmt"
   "math/rand"
   "os"
   "strconv"
   "strings"
   "time"
)

/*
*
通过reader流获取键盘输入的数字
*/
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流获取键盘输入的数字
   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
   }
   //通过strings字符串包中的Trim()过滤字符串前后空白,跟Java中的trim()方法一致
   input = strings.Trim(input, "\r\n")
   //将输入的字符串通过strconv.Atoi()转为int类型的整数
   guess, err := strconv.Atoi(input)
   //如果有错误信息就会直接返回错误信息
   if err != nil {
      fmt.Println("Invalid input. Please enter an integer value")
      return
   }
   //最后输出你猜的数字
   fmt.Println("You guess is", guess)
}

v4版本

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

最终版本

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

总结

1.观看了Go语言的实战案例中的猜字游戏
2.通过老师代码的层层演进,最终实现一个猜字游戏
3.了解了在Go中要想生成随机数必须要设置一个种子