Go语言工程实践之基础语法作业涉及的知识点
1.修改猜谜游戏的代码,用fmt.Scanf来简化代码实现
在原本的代码中用户输入功能是通过 bufio 包的 NewReader 方法创建一个读取器,用于读取用户的输入。
reader := bufio.NewReader(os.Stdin)
修改后使用 fmt.Scanf 获取用户输入的整数,整个读取的功能修改为下,通过使用 %d 格式指示符,就可以直接读取整数值,并将其赋值给 guess 变量。这样做的好处是可以避免了使用 bufio 包和字符串处理操作,代码更加简洁和易于理解。
for { _, err := fmt.Scanf("%d\n", &guess)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue }
总结下这样做的目的:
简洁性: 通过直接读取整数,省去了使用 bufio 进行读取和字符串处理的步骤,代码更加简洁易读。
类型安全: fmt.Scanf 的格式指示符确保只读取并接受整数值,避免了类型错误和输入不一致的问题。
减少错误: 代码量减少了,同时也减少了潜在的错误点,提高了代码的可维护性。
2.修改字典里的代码,增加另一种翻译引擎的支持
在原本代码中新增一个查询引擎的查询函数,在这里我们使用火山翻译引擎,整体思路与老师所讲的一致
- 创建 HTTP 请求: 首先,使用
http.Client{}创建一个 HTTP 客户端对象。然后,构建一个 HTTP POST 请求,使用http.NewRequest("POST", url, data)来创建请求对象,其中url是目标 API 的 URL,data是请求的数据体,即要发送的 JSON 数据。 - 设置请求头部信息: 使用
req.Header.Set()方法设置请求头部信息,包括authority、accept、content-type、cookie、user-agent等,这些头部信息模拟浏览器请求。 - 发送请求并处理响应: 使用客户端发送请求,获取响应,然后关闭响应体。通过
io.ReadAll(resp.Body)读取响应体的内容并存储在bodyText变量中。 上面的部分可以通过抓包并使用curlconverter.com/go/ 网址来生成 - 解析响应内容: 使用
json.Unmarshal()将响应内容解析为DictResponseHS结构体。这个结构体用于存储火山翻译引擎返回的数据。 对于结构体的解析可以使用oktools.net/json2go 来生成 - 解析详细数据: 从
DictResponseHS结构体中获取Details字段,该字段存储详细的翻译数据。对于每个详细数据项,获取Detail字段的 JSON 字符串,然后使用json.Unmarshal()解析为DictResponseHSData结构体。
var HSData DictResponseHSData
err = json.Unmarshal([]byte(jsonStr), &HSData)
if err != nil {
panic(err)
}
- 打印释义: 遍历
HSData.Result[0].Ec.Basic.Explains,这里存储了单词的释义。对于每个释义项,打印其Pos(部分词性)和Trans(释义内容)。
for _, item := range HSData.Result[0].Ec.Basic.Explains {
fmt.Println(item.Pos, item.Trans)
}
3.实现并行让两个提高两个引擎的速度
Go 语言对并行的支持体现在其并发模型之上,通过 Goroutines 和 Channels 实现并行任务的启动、协调和通信。在 Go 语言中,可以使用 Goroutines 来实现并行任务的启动。通过 go 关键字,可以在程序中启动多个 Goroutines,这些 Goroutines 可以并行地执行不同的任务,
func main() {
go task1()
go task2()
}
func task1() {
// 并行执行的任务1
}
func task2() {
// 并行执行的任务2
}
所以我们现在的目标是在拥有两个翻译引擎的基础上实现并行来提高他的速度,所以只需要参照go的用法将主函数中两个函数前增加go即可
func main()
略去前面代码
go querycaiyun(word)
go queryhuoshan(word)
}