课后作业实战| 青训营
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()
这样,就可以在多个协程中同时处理不同的任务,从而实现并行处理。