golang 基础:猜字游戏 | 青训营笔记

128 阅读2分钟

这是我参加【第三届青训营-后端场】笔记创作活动的第一篇笔记

猜字游戏:程序随机生成一个100以内的数字,然后输入端输入猜测的数字,如果比目标数字小,提示小于目标数字,重新输入,如果大于目标数字,提示大于目标数字,重新输入,直到成功猜到目标数字。

(1)首先是生成随机数,go语言生成随机数与Java略有不同,在使用rand方法生成随机数前需要生成随机数种子,否则每次生成的数字都会是同一个。

rand.Seed(time.Now().UnixNano())

然后就可以使用rand.Intn()方法生成随机数

package main

import (
	"fmt"
	"math/rand"
	"time"
)
func main() {
	maxNum := 100
	rand.Seed(time.Now().UnixNano())
	secretNumber := rand.Intn(maxNum)
	fmt.Println("The secret number is ", secretNumber)
}

(2)第二步,定义输入

reader := bufio.NewReader(os.Stdin)

bufio实现了有缓冲的io流,os.Stdin是golang的标准输入

input, err := reader.ReadString('\n')
	if err != nil {
		fmt.Println("An error occured while reading input. Please try again", err)
		return
	}

以换行符为分割,读取字符串,即一行一行的读取

提一下nil

nil是什么

nil 是一个预定义常量,用来表示特定几个类型的变量的零值。

一般的预定义常量都是有类型的,那么 nil 的类型是什么呢?

nil本身是没有类型的,且nil并不是关键字,是一个标识符,意思是无,零值。go语言中变量如果声明后没有赋值,就会有默认零值,下面是每种类型对应的默认零值:

bool      -> false                              
numbers   -> 0                                
string    -> ""      

pointers -> nil
slices -> nil
maps -> nil
channels -> nil
functions -> nil
interfaces -> nil

所以我们经常将 nil 赋值给 error 类型,并且以此来判断是否有错误,那是因为 error 是个接口,而接口的零值就是 nil,如果不等于默认零值,就是出现了错误

(3)将读取到的输出中的“\n”去掉,windows中则是“\r\n”

input = strings.TrimSuffix(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)

(4)逻辑判断

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

(5)加上循环,此时只能输入一次,需要实现可以多次输入

所以全部代码为:

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.TrimSuffix(input, "\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
		}
	}
}

此时功能就全部实现了