go 语言实战入门案例之猜数字

文章和代码已经归档至【Github仓库:https://github.com/timerring/backend-tutorial 】或者公众号【AIShareLab】回复 go 也可获取。

猜数字

第一个例子里面,我们会使用 Golang 来构建一个猜数字游戏。

在这个游戏里面,程序首先会生成一个介于 1 到 100 之间的随机整数,然后提示玩家进行猜测。玩家每次输入一个数字,程序会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。

go 复制代码
package main

import (
	"fmt"
	"math/rand"
)

func main() {
	maxNum := 100
	secretNumber := rand.Intn(maxNum)
	fmt.Println("The secret number is ", secretNumber)
}

通过尝试可以发现,每次生成的随机数都是一样的。

通过查看文档,可知随机数的生成会使用到一个随机种子。

否则每一次都会生成相同的随机数序列。一般用启动的时间戳来初始化随机数种子。这里使用 time.now.unix 来初始化随机种子。

go 复制代码
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)
}

然后实现用户输入输出,并理解析成数字。

每个程序执行的时候都会打开几个文件,stdin stdout stderr 等,stdin 文件可以用 os.Stdin 来得到。然后直接操作这个文件很不方便,我们会用 bufio.NewReader 把一个文件转换成一个 reader 变量。

reader 变量上有用来操作流的操作,可以用它的 ReadString 方法读取一行。如果失败会打印错误并能退出。ReadString 返回的结果包含结尾的换行符,把它去掉再转换成数字。如果转换失败,我们同样打印错误,退出。

go 复制代码
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 {
		// `reader` 变量上有用来操作流的操作,可以用它的 `ReadString` 方法读取一行。
		input, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("An error occured while reading input. Please try again", err)
			continue
		}
		// `ReadString` 返回的结果包含结尾的换行符,把它去掉。
		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
		}
	}
}

参考:字节内部课 Go 语言原理与实践

相关推荐
程序员-Benothing8 分钟前
如何实现高并发系统订单30分钟自动关闭?
开发语言·c#·wpf
郝学胜-神的一滴1 小时前
Python 高级编程 026:内置数据结构之骈文纵论
开发语言·数据结构·python·程序人生·软件工程
陈随易8 小时前
FFmpeg 9.0 发布,代号 Lei,音视频处理再升级
前端·后端·程序员
隐积9 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
凌虚11 小时前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
名字还没想好☜11 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
IT_陈寒12 小时前
Vite静态资源引用这个坑我踩得有点疼
前端·人工智能·后端
初级代码游戏12 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
前端开发张小七12 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
海盗123412 小时前
微软技术周报 ——2026-08-03
后端·python·microsoft·c#·.netcore