在线字典实践笔记

180 阅读5分钟

在线字典Go程序

程序背景

这个Go语言在线字典程序是一个演示性质的应用,用于通过搜狗翻译API和彩云翻译API查询用户输入的单词的含义。通过并行查询两个翻译引擎的结果,提高了查询效率,用户可以快速获取单词的多种翻译结果。

数据结构定义

首先,我们定义了两个结构体,用于在程序中处理请求和响应数据。

  1. DictRequest 结构体用于定义请求数据,它包含三个字段:
    • TransType:用于指定翻译类型,这里设为 "auto" 表示自动识别。
    • Source:用于指定源语言,这里设为 "zh-CHS" 表示中文简体。
    • UserID:用户ID,这里设为 "web"。
type DictRequest struct {
	TransType string `json:"trans_type"`
	Source    string `json:"source"`
	UserID    string `json:"user_id"`
}
  1. DictResponse 结构体用于定义响应结果的数据,具体字段根据API返回的数据而定,这里只展示了其中的部分字段。
type DictResponse struct {
	// 省略其他字段...
}

API使用说明

  1. 搜狗翻译API:该API接收POST请求,参数为JSON格式数据,其中 trans_type 表示翻译类型,source 表示源语言,user_id 表示用户ID。它返回包含备选翻译的单词和对应的翻译结果。
  2. 彩云翻译API:该API接收POST请求,参数为JSON格式数据,其中 trans_type 表示翻译类型,source 表示源语言。它返回单词的英式发音、美式发音和对应的释义。

查询搜狗翻译API

接下来,我们定义了函数 querySogou 用于查询搜狗翻译API。

  1. 首先,我们通过HTTP POST请求向搜狗翻译API发送JSON格式的请求数据,其中包含待翻译的单词和其他必要参数。
func querySogou(word string, wg *sync.WaitGroup) {
	defer wg.Done()

	// 搜狗翻译 API 的代码
	client := &http.Client{}
	a := DictRequest{
		TransType: "auto",
		Source:    "zh-CHS",
		UserID:    "web",
	}

	// 设置请求参数
	a.Source = word
	queryData, err := json.Marshal(a)
	if err != nil {
		log.Fatal(err)
	}

	req, err := http.NewRequest("POST", "https://fanyi.sogou.com/reventondc/suggV3", bytes.NewBuffer(queryData))
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Content-Type", "application/json;charset=UTF-8")
	req.Header.Set("Accept", "application/json")

	// 发送请求到搜狗翻译 API
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	// 读取和处理搜狗翻译 API 的响应
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}

	// 使用 map[string]interface{} 解析响应的 JSON 数据
	var response map[string]interface{}
	err = json.Unmarshal(bodyText, &response)
	if err != nil {
		fmt.Println("转换失败")
	}

	// 打印搜狗翻译结果
	if sugg, ok := response["sugg"]; ok {
		suggestions := sugg.([]interface{})
		for _, s := range suggestions {
			suggestion := s.(map[string]interface{})
			fmt.Println(suggestion["k"], suggestion["v"])
		}
	}
}
  1. 然后,我们从API的响应中读取和处理数据,并解析JSON数据得到搜狗翻译的结果。
  2. 最后,我们打印输出搜狗翻译的结果,即包含备选翻译的单词和对应的翻译结果。

在这个函数中,我们使用HTTP POST请求向搜狗翻译API发送JSON格式的请求数据,其中包含待翻译的单词和其他必要参数。然后,我们从API的响应中读取和处理数据,并解析JSON数据得到搜狗翻译的结果。最后,我们打印输出搜狗翻译的结果,即包含备选翻译的单词和对应的翻译结果。

查询彩云翻译API

接着,我们定义了函数 queryCaiyun 用于查询彩云翻译API。

  1. 同样地,我们通过HTTP POST请求向彩云翻译API发送JSON格式的请求数据,其中包含待翻译的单词和其他必要参数。
func queryCaiyun(word string, wg *sync.WaitGroup) {
	defer wg.Done()

	// 彩云翻译 API 的代码
	client := &http.Client{}

	// 构造彩云 API 的请求数据
	request := DictRequest{TransType: "en2zh", Source: word}

	// JSON 编码请求数据
	buf, err := json.Marshal(request)
	if err != nil {
		log.Fatal(err)
	}

	req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", bytes.NewBuffer(buf))
	if err != nil {
		log.Fatal(err)
	}

	// 设置彩云 API 请求的头部信息
	// 省略头部信息的设置...

	// 发送请求到彩云翻译 API
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	// 读取和处理彩云翻译 API 的响应
	bodyText, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}

	// 解析彩云翻译 API 的响应结构体
	var dictResponse DictResponse
	err = json.Unmarshal(bodyText, &dictResponse)
	if err != nil {
		log.Fatal(err)
	}

	// 打印输出彩云翻译结果
	fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
	for _, item := range dictResponse.Dictionary.Explanations {
		fmt.Println(item)
	}
}
  1. 然后,我们从API的响应中读取和处理数据,并解析JSON数据得到彩云翻译的结果。
  2. 最后,我们打印输出彩云翻译的结果,即单词的英式发音、美式发音和对应的释义。

在这个函数中,我们使用HTTP POST请求向彩云翻译API发送JSON格式的请求数据,其中包含待翻译的单词和其他必要参数。然后,我们从API的响应中读取和处理数据,并解析JSON数据得到彩云翻译的结果。最后,我们打印输出彩云翻译的结果,即单词的英式发音、美式发音和对应的释义。

主函数

main 函数中,我们实现了以下步骤:

  1. 通过 fmt.Scanln 函数获取用户输入的单词。
  2. 创建一个 sync.WaitGroup 对象 wg,它用于协调两个查询Goroutine的结束。
  3. 添加2个计数到 wg,表示有两个Goroutine需要等待。
  4. 使用 go 关键字并发启动两个查询Goroutine:querySogouqueryCaiyun
  5. 程序会等待所有

Goroutine执行完成后再退出主函数,通过调用 wg.Wait() 来实现。

func main() {
	var word string

	fmt.Print("请输入一个单词: ")
	fmt.Scanln(&word)

	// 使用 WaitGroup 确保所有 Goroutine 结束后程序退出
	var wg sync.WaitGroup
	wg.Add(2)

	// 并行查询两个翻译引擎的结果
	go querySogou(word, &wg)
	go queryCaiyun(word, &wg)

	// 等待所有 Goroutine 结束
	wg.Wait()
}

总体来说,这个程序充分利用了Go语言的并发特性,通过同时查询两个翻译引擎的结果来提高查询效率。每个翻译引擎的查询都是独立进行的,它们会并行执行,不会相互影响,最终的查询结果会打印输出给用户。

总结

通过这个Go语言在线字典程序,我们展示了如何使用并发来提高查询效率,同时通过两个翻译引擎的结果,用户可以获取更全面的翻译信息。这个程序是一个简单的示例,您可以根据实际需求进行扩展和优化。