GO语言工程实践课后作业:实现思路、代码以及路径记录
在本次的GO语言工程实践课中,我们的任务是实现一个翻译引擎。初始代码提供的是英文到中文的翻译(英译中),那么我们尝试实现中文到英文的翻译(中译英)。
1. 确定翻译引擎
首先,我们需要打开我们的代码编辑器marscode
,定位到项目的v1版本。在这里,我们可以看到请求代码的最初形态。
在代码中,我们注意到以下行:
var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
在这段代码中,有一个关键的字段trans_type
,它决定了翻译的类型。
为了实现中译英,我们需要将trans_type
的值从en2zh
更改为zh2en
。
var data = strings.NewReader(`{"trans_type":"zh2en","source":"你好"}`)
通过这个改动,我们成功地将翻译类型从英译中切换到了中译英。格式化后的JSON为
{
"rc": 0,
"wiki": {},
"dictionary": {
"entry": "你好",
"explanations": [
"how do you do; how are you; hello"
],
"related": [],
"source": "wenquxing",
"prons": {},
"type": ""
}
}
由于英译中表达多样,所以api只给出了可能的explanations,没有其他字段。
可以看到,explanations
字段就是我们所期望的翻译内容。
2.转为相关结构体
为了更好地处理这些数据,我们需要将JSON响应转换为GO语言中的数据结构。通过使用在线工具,我们可以轻松地将JSON格式的数据映射到GO的结构体中。
type AutoGenerated struct {
Rc int `json:"rc"`
Wiki struct {
} `json:"wiki"`
Dictionary struct {
Entry string `json:"entry"`
Explanations []string `json:"explanations"`
Related []interface{} `json:"related"`
Source string `json:"source"`
Prons struct {
} `json:"prons"`
Type string `json:"type"`
} `json:"dictionary"`
}
在项目v3版本中运行这段代码(记得修改结构体名称以匹配你的项目需求),我们发现它能够正确地匹配并解析JSON数据。
3.设置打印格式
在中译英的场景中,我们主要关注explanations
字段。由于一个中文词可能对应多个英文词,这些词会通过;
分隔。
因此,在控制台输出时,我们也可以通过;
来分割并换行打印每个翻译结果。
var expalinIndex int = 0
for _, explanation := range dictResponse2.Dictionary.Explanations {
parts := strings.Split(explanation, "; ")
for _, part := range parts {
fmt.Printf("%d. %s\n", expalinIndex+1, part)
expalinIndex++
}
}
实现效果如下
这样的打印格式使得输出更加清晰易读。
4.自动识别语言
为了进一步提升用户体验,我们决定实现一个自动检测语言的功能。这样,如果用户提供的参数是中文,系统就会自动选择中译英;如果是英文,则选择英译中。
如何判断是输入的参数是英文还是中文呢?可以通过判断是否属于汉字 Unicode 编码范围来判定。
以下是实现这一功能的代码:
// DetermineLanguage 判断字符串是中文还是英文,并返回相应的字符串
func DetermineLanguage(str string) string {
// 初始化两个布尔变量,分别表示字符串是否为中文和英文
isChinese := true
isEnglish := true
// 遍历字符串中的每个字符
for _, r := range str {
// 如果字符不属于汉字 Unicode 编码范围,则将 isChinese 标记为 false
if!unicode.Is(unicode.Scripts["Han"], r) &&!unicode.Is(unicode.Han, r) {
isChinese = false
}
// 如果字符不是字母或者属于汉字 Unicode 编码范围,则将 isEnglish 标记为 false
if!unicode.IsLetter(r) || unicode.Is(unicode.Scripts["Han"], r) {
isEnglish = false
}
}
if isChinese {
return "zh2en"
} else if isEnglish {
return "en2zh"
} else {
// 如果字符串既不是纯中文也不是纯英文,可以返回错误信息或者根据需求处理
return "invalid"
}
}
在执行查询前,我们先调用这个函数来判断语言类型,然后将返回的字符串作为trans_type
传递给翻译引擎。
实现效果
- 能够正常识别用户输入英文or中文
- 能够匹配正确的翻译引擎
- 能够给出相应的输出
总结
在本次GO语言工程实践课程中,我们成功实现了一个自动语言识别和翻译的系统。
通过修改翻译引擎的请求参数,我们从最初的英译中转变为中译英。我们利用GO语言的结构体来解析API返回的JSON数据,并针对中文词汇可能对应的多个英文翻译进行了格式化输出,使得结果更加清晰。
此外,我们还实现了一个自动检测语言的功能,能够根据用户输入自动选择翻译方向,从而提升系统的智能化和用户体验。
总的来说,小项目锻炼了我们对GO语言的掌握,也加深了我们对API交互和数据处理的理解。
相关代码: