这是我参与「第五届青训营 」伴学笔记创作活动的第 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中要想生成随机数必须要设置一个种子