Go 基础笔记——实战案例 DAY 02| 青训营

51 阅读5分钟

DAY2 | Go语言的实战案例

1、猜数字游戏

package main
​
import (
    "fmt"
    "math/rand"
    "time"
)
​
func main() {
    maxNum := 100
    rand.Seed(time.Now().UnixNano())
    //rand.Seed后面加时间戳
    secretNumber := rand.Intn(maxNum)
    fmt.Println("The secret number is", secretNumber)
}

使用package main对包进行声明,main函数作为函数的入口点

  • "fmt": 这是Go语言的标准库中提供的格式化输入输出包,用于在控制台上打印输出。
  • "math/rand": 这是Go语言的标准库中提供的用于生成随机数的包。
  • "time": 这是Go语言的标准库中提供的用于时间相关操作的包。

首先定义一个设置随机数最大范围的变量maxNum,生成的随机数范围在0到maxNum-1

接着初始化随机数生成器,rand.Seed 是用来初始化伪随机数生成器的种子(seed)的函数。

在计算机中,由于随机数实际上是伪随机数,所以需要一个种子来初始化生成器。time.Now().UnixNano()返回当前时间的时间戳,这个时间戳会不断变化,因此可以用时间戳初始化随机数种子,以确保每次程序运行时生成的随机数都是不同的。

最后将生成的随机数赋值给secretNum,打印出来

接下来再对代码进行改进

import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "strings"
    "time"
)
  • "bufio": 提供带缓冲的 I/O 操作,用于读取用户输入。
  • "os": 提供与操作系统交互的功能,这里用来访问标准输入。
  • "strconv": 用于字符串和数字之间的转换。
  • "strings": 用于处理字符串相关的操作。

1、reader := bufio.NewReader(os.Stdin): 创建一个 bufio.Reader 对象,用于从标准输入(键盘)读取用户输入。

2、加入了一个循环以便于让用户一直猜测

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
        }
    }

3、guess, err := strconv.Atoi(input): 使用 strconv.Atoi 函数将字符串类型的输入转换为整数类型,并将结果保存到 guess 变量中。同时,检查是否发生了错误。

4、将用户的输入转换为整数:guess, err := strconv.Atoi(input): 使用strconv.Atoi函数将字符串类型的输入转换为整数类型,并将结果保存到guess` 变量中。同时,检查是否发生了错误。

5、判断用户猜测是否正确,并给予反馈:

  • fmt.Println("You guess is", guess): 打印用户的猜测值。
  • 使用条件语句对用户猜测的数字进行判断,根据与 secretNumber 的比较给予相应的反馈。如果猜测的数字大于 secretNumber,则提示用户猜测过大;如果猜测的数字小于 secretNumber,则提示用户猜测过小。
  • 如果用户猜测的数字等于 secretNumber,则打印 "Correct, you Legend!" 并结束循环。

2、词典

通过调用彩云小译的API接口实现英汉翻译

导入依赖包

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
)
  • "io/ioutil": 用于读取 HTTP 响应的主体内容。
  • "log": 用于日志记录,这里用来处理错误信息。
  • "net/http": 用于发送 HTTP 请求和处理响应。
  1. 创建HTTP客户端

    client := &http.Client{}
    

    创建一个名为client的客户端,使用默认配置

  2. 构建HTTP请求

    var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
    req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)
    if err != nil {
        log.Fatal(err)
    }
    

    创建一个POST请求,并且设置请求的URL以及请求体

    strings.NewReader 函数用于将字符串转换为 io.Reader 接口类型,以便将 JSON 数据作为请求体发送

  3. 设置HTTP请求头

    req.Header.Set("Connection", "keep-alive")
    // ... (省略其他头部设置,类似上述设置)
    req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")
    
  4. 发送HTTP请求并获取响应

    resp, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    

    使用 HTTP 客户端 client 发送 HTTP 请求,并获取响应。client.Do(req) 发送请求并返回响应

  5. 读取响应主体内容

    bodyText, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    

    使用 ioutil.ReadAll 函数从 HTTP 响应主体中读取全部数据,并将结果保存在 bodyText 变量中

改进思路:功能上新增英文词典查询的能力。用户只需在命令行中输入英文单词,程序就会向彩云小译的 API 发送请求,并输出该英文单词的中文解释以及一些其他相关信息

新增 "encoding/json" 包,用于处理 JSON 数据的编码和解码

首先定义结构体

type DictRequest struct {
    TransType string `json:"trans_type"`
    Source    string `json:"source"`
    UserID    string `json:"user_id"`
}
​
type DictResponse struct {
    // ... (省略了 DictResponse 的其他字段定义,与 JSON 数据对应)
}

DictRequestDictResponse,用于描述请求和响应的 JSON 数据的结构

再增加一个 query 函数:

func query(word string) {
    // ... (函数体,用于发送 HTTP 请求和解析响应,获取词典数据)
}

用于向彩云小译的 API 接口发送 HTTP POST 请求,查询英文单词的词典数据。它使用 word 作为输入参数,表示要查询的英文单词

添加两个结构体DictRequestDictResponse

request := DictRequest{TransType: "en2zh", Source: word}
buf, err := json.Marshal(request)
// ... (省略了后续的请求头设置和发送请求的代码)var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse)
// ... (省略了处理响应结果并打印的代码)

DictRequest 结构体构建请求的 JSON 数据,并使用 json.Marshal 将结构体转换为 JSON 字节流。而后,使用 json.Unmarshal 将获取的 JSON 数据转换为 DictResponse 结构体,以便处理和打印词典查询的结果

错误处理:在发送请求和处理响应时,通过使用 log.Fatal 记录错误并退出程序

命令行参数处理:通过 os.Args 获取用户输入的命令行参数,指示用户如何使用这个简单词典查询程序