猜谜游戏
思路
- 修改猜谜游戏的最终代码,使用fmt.Scanf来简化代码
- 使用 fmt.Scanf 函数来读取用户输入的整数,避免了使用 bufio.NewReader 和读取字符串的操作。这样可以简化代码并提高用户输入的便捷性。
bufio 和 fmt.Scanf 都是 Go 语言中用于读取用户输入的方法,它们具有不同的特点和适用场景。
- bufio:bufio 提供了一个用于缓冲读取的接口,可以方便地读取用户输入的文本行或特定分隔符之前的内容。使用 bufio 的 NewReader 函数创建一个读取器,可以通过调用其 ReadString 或 ReadBytes 等方法进行读取操作。bufio 提供了更灵活的读取方式,并且对于处理大量输入以及逐行读取的情况效果更好。
- fmt.Scanf:fmt.Scanf 是 fmt 包提供的一个函数,用于从标准输入读取格式化的输入数据。它根据指定的格式字符串解析输入并将结果存储在变量中。fmt.Scanf 对于简单的格式化输入非常方便,可以针对特定的格式进行快速、类型安全的解析。它适用于对输入格式要求较为严格的情况,比如需要按照特定格式输入的数字、字符串等。
fmt.Scanf用法 fmt.Scanf 函数的具体描述如下:
func Scanf(format string, a ...interface{}) (n int, err error)
- Scanf 根据 format 参数指定的格式字符串从标准输入中读取输入,并根据需要将解析的结果存储到传递给函数的参数中。
- 格式字符串 format 包含普通字符(非 '%')和转义序列('%'加上一个特定的字母)。参与解析的参数必须是指针,用于接收解析出的值。对于每个转义序列,Scanf 会读取输入中的连续字符,直到遇到下一个空白字符(默认情况下是空格、制表符和换行符)为止。
- Scanf 返回成功解析的参数数量和可能的错误。如果解析过程中发生错误,则停止解析,并返回错误信息。
- 在 format 字符串中,可以使用以下格式化字符:
- %d:以十进制解析一个有符号整数。
- %s:解析一个字符串,直到遇到下一个空白字符为止。
- %f:解析一个浮点数。
- %t:解析一个布尔值(true 或 false)。
- %v:根据参数的类型进行解析(支持大部分基本类型)。
- 除了这些基本的格式化字符之外,还可以使用更复杂的格式化规范,例如指定宽度、精度和填充字符。 此外,Scanf 还支持一些特殊字符,如空白字符、换行符和要求匹配的字符等。
需要注意的是,在使用 fmt.Scanf 进行输入解析时,要确保输入的数据与格式字符串一致,否则可能导致解析错误或得到意外的结果。
代码
想要消除回车符(\r)的计入,可以使用 fmt.Scanln 函数替代。fmt.Scanln 函数会读取一行输入,并以空格分隔输入的各项内容
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
// 随机种子
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("Please input your guess")
var guess int
for {
_, err := fmt.Scanf("%d", &guess)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("Your 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
}
}
}