GO语言工程实践课后作业:实现思路、代码以及路径记录 | 豆包MarsCode AI刷题

128 阅读4分钟

GO语言工程实践课后作业:实现思路、代码以及路径记录

在本次的GO语言工程实践课中,我们的任务是实现一个翻译引擎。初始代码提供的是英文到中文的翻译(英译中),那么我们尝试实现中文到英文的翻译(中译英)。

1. 确定翻译引擎

首先,我们需要打开我们的代码编辑器marscode,定位到项目的v1版本。在这里,我们可以看到请求代码的最初形态。

在代码中,我们注意到以下行:

var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)

在这段代码中,有一个关键的字段trans_type,它决定了翻译的类型。

QQ_1730612975095.png

为了实现中译英,我们需要将trans_type的值从en2zh更改为zh2en

	var data = strings.NewReader(`{"trans_type":"zh2en","source":"你好"}`)

{A6B2EF14-3E6E-417F-9C09-BFCFFE8BF38B}.png

通过这个改动,我们成功地将翻译类型从英译中切换到了中译英。格式化后的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的结构体中。

{0DAAE4C1-4089-4158-BD14-0B452D2DA440}.png

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数据。

{9C6263C5-E116-427B-AF1C-AC3D42A08A93}.png

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++
		}
	}

实现效果如下

{7BD2FAE1-6CA3-4618-BDEC-5A5B97F2A230}.png

这样的打印格式使得输出更加清晰易读。

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中文
  • 能够匹配正确的翻译引擎
  • 能够给出相应的输出

{08EF9281-8DD4-4098-A476-5430171DE119}.png

总结

在本次GO语言工程实践课程中,我们成功实现了一个自动语言识别和翻译的系统。

通过修改翻译引擎的请求参数,我们从最初的英译中转变为中译英。我们利用GO语言的结构体来解析API返回的JSON数据,并针对中文词汇可能对应的多个英文翻译进行了格式化输出,使得结果更加清晰。

此外,我们还实现了一个自动检测语言的功能,能够根据用户输入自动选择翻译方向,从而提升系统的智能化和用户体验。

总的来说,小项目锻炼了我们对GO语言的掌握,也加深了我们对API交互和数据处理的理解。

相关代码: