课后作业
- 修改第一个例子猜谜游戏里面的最终代码,使用fmt.Scanf来简化代码实现
- 修改第二个例子的命令行词典里面的最终代码,增加另一种翻译引擎的支持
- 在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度
问题一
bufio.NewReader(os.Stdin)与fmt.Scanf()的区别
1. bufio.NewReader(os.Stdin)
bufio.NewReader 提供了一种通过缓冲读取输入的方法,适合处理整行文本输入或需要灵活控制输入的情况。
2. fmt.Scanf()
fmt.Scanf() 是 Go 提供的一种格式化输入方式,适合读取固定格式的数据(如整数、浮点数、字符串等)。
修改方法
//使用
var input string
var err error
_,err = fmt.Scanf("%s", &input)
guess, err := strconv.Atoi(input)
//代替
reader := bufio.NewReader(os.Stdin)
input = strings.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)
问题二
步骤:仿照抓彩云小译的包,抓必应翻译
复制为curl(bash), 再使用在线curl转go代码,得到可以发get请求的代码
得到响应,用json转go结构体,将响应结果写入结构体
[{"translations":[{"text":"快乐","transliteration":{"text":"kuàilè","script":"Latn"},"to":"zh-Hans","sentLen":{"srcSentLen":[5],"transSentLen":[2]}}],"detectedLanguage":{"language":"en"}}]
//核心字段:Translations.Test,Translations.Transliteration
type JSONData []struct {
Translations []struct {
Text string `json:"text"`
Transliteration struct {
Text string `json:"text"`
Script string `json:"script"`
} `json:"transliteration"`
To string `json:"to"`
SentLen struct {
SrcSentLen []int `json:"srcSentLen"`
TransSentLen []int `json:"transSentLen"`
} `json:"sentLen"`
} `json:"translations"`
DetectedLanguage struct {
Language string `json:"language"`
} `json:"detectedLanguage"`
}
问题三
在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度
这里我使用了go.mod来维护文件夹关系,给彩云小译和bing拆分为两个文件夹,方便维护
package main
import (
"fmt"
"sync"
"v5-myVersion/caiyunxiaoyi"
"v5-myVersion/bingTranslate"
)
func main() {
fmt.Printf("请输入要查询的单词:")
var word string
_, err := fmt.Scanf("%s", &word)
if err != nil {
fmt.Println("单词输入错误")
return
}
// 使用 WaitGroup 来同步并行任务
var wg sync.WaitGroup
wg.Add(2) // 等待两个 goroutine 完成
// 并行调用翻译引擎
go func() {
defer wg.Done() // 任务完成,减1
caiyunxiaoyi.SearchFromCaiYunXaioYi(word)
}()
go func() {
defer wg.Done() // 任务完成,减1
bingTranslate.SearchFromBingTranslate(word)
}()
// 等待所有并行任务完成
wg.Wait()
}
-
同步机制:
- 使用
sync.WaitGroup确保主线程会等待两个翻译请求完成后再退出,而不会提前终止。
- 使用
-
通道关闭:
- 在
WaitGroup完成后关闭通道,确保数据消费正常且无资源泄漏。
- 在
运行结果:
番外:豆包MarsCode AI练中学的使用
AI练中学提供了基于linux/amd64、go 1.22.3版本的运行环境,我们不用配置环境及其环境变量即可运行go代码
houduanrumen---Go-yuyanyuanliyushijian go version
go version go1.22.3 linux/amd64
集成了豆包MarsCode AI的在线ide,更方便我们入门Go语言,有语法、算法问题都可问它
我们可以在工作区新建自己的文件夹,开放度十足!