课后作业实战 | 青训营

123 阅读3分钟

课后作业实战| 青训营

1. 猜字谜

  • 老师讲授的生成随机数的代码 rand.Seed() 在 Golang 1.20 版本中已被废弃,因此我进行了修改。修改后的代码如下:

    maxNum := 100   
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    secretNumber := r.Intn(maxNum)
    

    在这段代码中,secretNumber 被赋值为生成的随机数,而 maxNum 则是限制随机数范围的最大值,需要保证 maxNum 的值大于 0。

  • 使用fmt.Scanf()改进来获取用户输入.
        fmt.Scanf("%s\r\n", &input)
        //reader := bufio.NewReader(os.Stdin)
        //// 读取一行输入
        //input, err := reader.ReadString('\n')
        //if err != nil {
        //  fmt.Println("读取错误", err)
        //  return
        //}
        //// 去除换行符
        //input = strings.TrimSuffix(input, "\r\n")
        //转换为int
        guess, err := strconv.Atoi(input)

这段代码中,用户输入的字符串会被存储在变量 input 中,然后通过 strconv.Atoi() 函数将其 转换为整数类型。这样,作者就能够获取到用户猜测的数字了,用户猜测的代码储存在guess变量中。

2.在线词典

明确目的: 在代码中集成一个有道翻译的API,以便通过HTTP请求向有道服务器发送文本翻译请求。随后,对返回的非标准JSON进行解析,并将所需数据映射到相应的数据结构中,最终将结果打印输出。为了提高效率,引入协程来实现彩云翻译查询和新增的有道翻译接口的并行处理。

有道翻译API集成与并行处理

本文我将逐步集成有道翻译API,通过HTTP请求向有道服务器发送文本翻译请求,并解析返回的非标准JSON数据。此外,还会介绍如何将所需数据映射到相应的数据结构中,并通过协程实现与彩云翻译查询并行处理的步骤。

1. 创建HTTP客户端

首先,我们需要创建一个HTTP客户端,以便能够发送请求和获取响应。在Go语言中,我们可以使用http.Client来实现这一功能。

client := &http.Client{}

2. 构建请求参数

在集成有道翻译API时,需要构建适当的请求参数。根据我们的需求,我们可以创建一个结构体来存储这些参数。在这个例子中,我们假设存在名为DictRequestyd的结构体。

dict := DictRequestyd{From: "Auto", To: "Auto", Q: word}
body := url.Values{}
body.Set("from", dict.From)
body.Set("to", dict.To)
body.Set("q", dict.Q)

3. 创建并发送请求

使用构建好的请求参数,我们可以创建一个POST请求对象,并设置适当的请求头部信息。

req, err := http.NewRequest("POST", "https://aidemo.youdao.com/trans", strings.NewReader(body.Encode()))
if err != nil {
    log.Fatal(err)
}
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36")
req.Header.Set("origin", "https://ai.youdao.com")
req.Header.Set("referer", "https://ai.youdao.com/")

接着,我们使用HTTP客户端发送请求并获取响应。

resp, err := client.Do(req)
if err != nil {
    fmt.Println(err)
    return
}
defer resp.Body.Close()

4. 处理响应数据

一旦获得响应,我们可以读取其内容,并将非标准JSON数据解析为结构体。这里,我们使用io.ReadAll读取响应内容,然后使用json.Unmarshal解析为DictResponseyd结构体。

bodyText, _ := io.ReadAll(resp.Body)
var respBody DictResponseyd
err = json.Unmarshal(bodyText, &respBody)
if err != nil {
    log.Fatal(err)
}

5. 打印翻译结果

最后,我们可以将翻译结果以及相关的数据打印出来,以便查看结果。

fmt.Println("有道翻译")
fmt.Println(word)
fmt.Println("Translation:", respBody.Translation)
fmt.Println("Explains:", respBody.Basic.Explains)

6. 引入协程实现并行处理

要实现与其他任务的并行处理,我们可以将这个有道翻译函数放入协程中运行。此外,为了提高效率,我们可以考虑将彩云翻译查询与有道翻译接口的调用同时进行。这可以通过使用Go语言的协程(goroutine)来实现。

在这个过程中,我们可以使用sync.WaitGroup来等待所有协程的完成。

var wg sync.WaitGroup
wg.Add(1) // 增加协程计数
go ydQuery("your_word", &wg) // 启动有道翻译协程
// 启动彩云翻译协程或其他任务// 等待所有协程完成
wg.Wait()

这样,就可以在多个协程中同时处理不同的任务,从而实现并行处理。