GO语言工程实践课后作业1 | 青训营

52 阅读3分钟

猜谜游戏

思路

  • 修改猜谜游戏的最终代码,使用fmt.Scanf来简化代码
  • 使用 fmt.Scanf 函数来读取用户输入的整数,避免了使用 bufio.NewReader 和读取字符串的操作。这样可以简化代码并提高用户输入的便捷性。

bufio 和 fmt.Scanf 都是 Go 语言中用于读取用户输入的方法,它们具有不同的特点和适用场景。

  1. bufio:bufio 提供了一个用于缓冲读取的接口,可以方便地读取用户输入的文本行或特定分隔符之前的内容。使用 bufio 的 NewReader 函数创建一个读取器,可以通过调用其 ReadString 或 ReadBytes 等方法进行读取操作。bufio 提供了更灵活的读取方式,并且对于处理大量输入以及逐行读取的情况效果更好。
  2. fmt.Scanf:fmt.Scanf 是 fmt 包提供的一个函数,用于从标准输入读取格式化的输入数据。它根据指定的格式字符串解析输入并将结果存储在变量中。fmt.Scanf 对于简单的格式化输入非常方便,可以针对特定的格式进行快速、类型安全的解析。它适用于对输入格式要求较为严格的情况,比如需要按照特定格式输入的数字、字符串等。

fmt.Scanf用法 fmt.Scanf 函数的具体描述如下:

func Scanf(format string, a ...interface{}) (n int, err error)
  1. Scanf 根据 format 参数指定的格式字符串从标准输入中读取输入,并根据需要将解析的结果存储到传递给函数的参数中。
  2. 格式字符串 format 包含普通字符(非 '%')和转义序列('%'加上一个特定的字母)。参与解析的参数必须是指针,用于接收解析出的值。对于每个转义序列,Scanf 会读取输入中的连续字符,直到遇到下一个空白字符(默认情况下是空格、制表符和换行符)为止。
  3. Scanf 返回成功解析的参数数量和可能的错误。如果解析过程中发生错误,则停止解析,并返回错误信息。
  4. 在 format 字符串中,可以使用以下格式化字符:
  • %d:以十进制解析一个有符号整数。
  • %s:解析一个字符串,直到遇到下一个空白字符为止。
  • %f:解析一个浮点数。
  • %t:解析一个布尔值(true 或 false)。
  • %v:根据参数的类型进行解析(支持大部分基本类型)。
  1. 除了这些基本的格式化字符之外,还可以使用更复杂的格式化规范,例如指定宽度、精度和填充字符。 此外,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  
        }  
    }  
}