当前位置: 首页 > news >正文

Go语言实践案例之简单字典

一、程序要实现效果:

在命令行调用程序的时候,可以在命令行的后面查询一个单词,然后会输出单词的音标和注释。

二、思路分析:

  1. 定义一个结构体 DictRequest,用于表示翻译请求的数据结构。其中包含了 TransType(翻译类型)、Source(源语言单词)、UserID(用户ID)等字段。
  2. 定义一个结构体 DictResponse,用于表示翻译响应的数据结构。其中包含了 Rc(返回码)、Wiki(维基百科信息)、Dictionary(词典信息)等字段。
  3. 定义一个函数 query,用于执行翻译请求并获取翻译结果。该函数接受一个参数 word,表示要翻译的单词。
  4. query 函数中,首先创建了一个 HTTP 客户端对象 client,然后构造了一个 DictRequest 对象 request,并将 TransType 设置为 "en2zh",表示将源语言翻译成中文。
  5. 接下来,将 request 对象序列化为 JSON 格式的字节流 buf,并创建一个 bytes.Reader 对象 data 来读取该字节流。
  6. 然后,构造一个 HTTP 请求对象 req,使用 http.NewRequest 函数设置请求的方法为 "POST",URL 为 "api.interpreter.caiyunai.com/v1/dict",并将 data 作为请求的主体数据。
  7. 接着,设置请求头的各项字段,包括连接方式、用户代理、自定义头部字段等。其中,有一些字段的值是通过函数调用来设置的,比如 req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi") 设置了 X-Authorization 头部字段的值为 "token:qgemv4jr1y38jyq6vhvi"。
  8. 最后,通过调用 client.Do(req) 发送请求,并获取到响应对象 resp
  9. 关闭响应对象的 Body 流,并将响应的字节流读取为字符串 bodyText
  10. 使用 json.Unmarshal 函数将 bodyText 解析为 DictResponse 对象 dictResponse
  11. 最后,打印出翻译结果,包括源单词的中英文翻译以及一些解释性的信息。
  12. main 函数中,首先检查命令行参数的数量是否正确,如果不正确则输出使用方法并退出程序。
  13. 如果参数数量正确,则从命令行参数中获取要翻译的单词,并调用 query 函数进行翻译。

三、具体代码

package mainimport ("bytes""encoding/json""fmt""io/ioutil""log""net/http""os"
)type DictRequest struct {TransType string `json:"trans_type"`Source    string `json:"source"`UserID    string `json:"user_id"`
}type DictResponse struct {Rc   int `json:"rc"`Wiki struct {KnownInLaguages int `json:"known_in_laguages"`Description     struct {Source string      `json:"source"`Target interface{} `json:"target"`} `json:"description"`ID   string `json:"id"`Item struct {Source string `json:"source"`Target string `json:"target"`} `json:"item"`ImageURL  string `json:"image_url"`IsSubject string `json:"is_subject"`Sitelink  string `json:"sitelink"`} `json:"wiki"`Dictionary struct {Prons struct {EnUs string `json:"en-us"`En   string `json:"en"`} `json:"prons"`Explanations []string      `json:"explanations"`Synonym      []string      `json:"synonym"`Antonym      []string      `json:"antonym"`WqxExample   [][]string    `json:"wqx_example"`Entry        string        `json:"entry"`Type         string        `json:"type"`Related      []interface{} `json:"related"`Source       string        `json:"source"`} `json:"dictionary"`
}func query(word string) {client := &http.Client{}request := DictRequest{TransType: "en2zh", Source: word}buf, err := json.Marshal(request)if err != nil {log.Fatal(err)}var data = bytes.NewReader(buf)req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data)if err != nil {log.Fatal(err)}req.Header.Set("Connection", "keep-alive")req.Header.Set("DNT", "1")req.Header.Set("os-version", "")req.Header.Set("sec-ch-ua-mobile", "?0")req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36")req.Header.Set("app-name", "xy")req.Header.Set("Content-Type", "application/json;charset=UTF-8")req.Header.Set("Accept", "application/json, text/plain, */*")req.Header.Set("device-id", "")req.Header.Set("os-type", "web")req.Header.Set("X-Authorization", "token:qgemv4jr1y38jyq6vhvi")req.Header.Set("Origin", "https://fanyi.caiyunapp.com")req.Header.Set("Sec-Fetch-Site", "cross-site")req.Header.Set("Sec-Fetch-Mode", "cors")req.Header.Set("Sec-Fetch-Dest", "empty")req.Header.Set("Referer", "https://fanyi.caiyunapp.com/")req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9")req.Header.Set("Cookie", "_ym_uid=16456948721020430059; _ym_d=1645694872")resp, err := client.Do(req)if err != nil {log.Fatal(err)}defer resp.Body.Close()bodyText, err := ioutil.ReadAll(resp.Body)if err != nil {log.Fatal(err)}if resp.StatusCode != 200 {log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))}var dictResponse DictResponseerr = 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)}
}func main() {if len(os.Args) != 2 {fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello`)os.Exit(1)}word := os.Args[1]query(word)
}

四、实现过程中可能比较有难度的问题

  1. 错误处理:在发送网络请求时,可能会出现连接错误、超时错误、服务器错误等。需要对这些错误进行适当的处理,比如重试、记录日志、返回错误信息等。
  2. 请求头设置:在构造 HTTP 请求时,需要设置各种请求头字段,比如 User-Agent、Cookie、Authorization 等。需要注意各个字段的格式和含义,并确保它们符合 API 的要求。
  3. 编码问题:由于 API 返回的数据可能是 UTF-8 或其他编码方式,需要进行相应的解码操作才能正确地读取其中的内容。同时,在构造请求体时,也需要注意数据的编码和转义问题。
  4. JSON 解析:在解析 JSON 数据时,可能会出现解码错误、类型断言错误等问题。需要使用合适的方法来解析 JSON 数据,比如使用 json.Unmarshal 函数将字节流解析为结构体,或使用 json.Decode 函数将字符串解析为 JSON 对象。
  5. 多语言支持:代码中涉及到了中英文翻译的逻辑,需要根据源语言和目标语言的不同来构造相应的翻译请求。这可能涉及到字符串的处理、字符编码的转换等问题。

五、总结

本篇文章介绍了如何去创建一个简单的命令行字典,其功能为可以将输入的单词翻译成中文或英文。它使用了Interpreter API来与翻译服务进行交互,并通过HTTP请求发送翻译请求并获取响应数据。代码中包含了错误处理、请求头设置、JSON解析等关键步骤,以确保程序的稳定性和正确性。此外,还考虑了多语言支持和编码问题,以应对不同的情况。

如果你对编程有一定的基础,并且对网络编程和JSON解析有一定的了解,那么可以尝试阅读和理解这段代码。通过学习和实践,你可以掌握如何使用Interpreter API来进行翻译服务的开发,以及如何解析和处理JSON数据。这将为你进一步深入学习编程和开发有趣的应用程序提供有价值的经验和技能。

相关文章:

Go语言实践案例之简单字典

一、程序要实现效果: 在命令行调用程序的时候,可以在命令行的后面查询一个单词,然后会输出单词的音标和注释。 二、思路分析: 定义一个结构体 DictRequest,用于表示翻译请求的数据结构。其中包含了 TransType&#…...

笔试面试相关记录(3)

(1)String String和String.append()的底层实现 C中string append函数的使用与字符串拼接「建议收藏」-腾讯云开发者社区-腾讯云 (tencent.com) String String 在 第二个String中遇到\0就截止,append()的方法则是所有字符都会加在后面。 &…...

第6章_瑞萨MCU零基础入门系列教程之串行通信接口(SCI)

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...

开源免费的流程图软件draw.io

2023年9月16日,周六上午 想买微软的visio,但发现不是很值得,因为我平时也不是经常需要画图。 所以我最后还是决定使用开源免费的draw.io来画图 draw.io网页版的网址: Flowchart Maker & Online Diagram Software draw.io的…...

Python绘图系统19:添加时间轴以实现动态绘图

文章目录 时间轴单帧跳转源代码 Python绘图系统: 📈从0开始的3D绘图系统📉一套3D坐标,多个函数📊散点图、极坐标和子图自定义控件:绘图风格📉风格控件📊定制绘图风格坐标设置进阶&a…...

深度解析shell脚本的命令的原理之rm

rm 是 Unix/Linux 系统中的一个基本命令,用于删除文件或目录。以下是对这个命令的深度分析: 基本操作:rm 命令删除一个或多个文件或目录。这是通过从文件系统中移除链接来完成的。在 Unix/Linux 中,文件是通过链接(可以…...

RPA机器人流程自动化专题培训大纲(供大家参考使用)

一、RPA机器人流程自动化概述 RPA的定义和发展历程RPA的应用场景和优势RPA与人工智能的关系 二、RPA机器人流程自动化基础知识 RPA的基本原理和技术架构RPA的常用技术和工具RPA的编程语言和开发环境 三、RPA机器人流程自动化实战应用 如何进行业务流程分析与优化如何利用R…...

Python用若干列的数据多条件筛选、去除Excel数据并批量绘制直方图

本文介绍基于Python,读取Excel数据,以一列数据的值为标准,对这一列数据处于指定范围的所有行,再用其他几列数据数值,加以筛选与剔除;同时,对筛选与剔除前、后的数据分别绘制若干直方图&#xff…...

驱动开发,IO多路复用实现过程,epoll方式

1.框架图 被称为当前时代最好用的io多路复用方式; 核心操作:一棵树(红黑树)、一张表(内核链表)以及三个接口; 思想:(fd代表文件描述符) epoll要把检测的事件…...

java在mysql中查询内容无法塞入实体类中,报错 all elements are null

目录 一、问题描述二、解决方案 一、问题描述 java项目中整体配置了mysql的驼峰式字段匹配规则。 mybatis.configuration.map-underscore-to-camel-casetrue由于项目需求,需要返回字段为file_id,file_url,并且放入实体类中,实体…...

Linux 挂载

挂载需要挂载源和挂载点 虚拟机本身就有的挂源 添加硬件 重启虚拟机 操作程序 sudo fdisk -l //以管理员权限查看电脑硬盘使用情况sudo mkfs.ext4 /dev/sdb //以管理员身份格式化硬盘sudo mkdir guazai //创建挂载文件夹 sudo mount /dev/sdb/guazai //将挂载源接上挂载点 s…...

[面试] 15道最典型的k8s面试题

文章目录 在 Kubernetes 中,有以下常见的资源对象:1.什么是 Kubernetes?它的主要特点是什么?2. Kubernetes 中的 Pod 是什么?它的作用是什么?3.Kubernetes 中的 Deployment 和 StatefulSet 有何区别&#x…...

lintcode 552 · 创建最大数 【算法 数组 贪心 hard】

题目 https://www.lintcode.com/problem/552/description 描述 给出两个长度分别是m和n的数组来表示两个大整数&#xff0c;数组的每个元素都是数字0-9。从这两个数组当中选出k个数字来创建一个最大数&#xff0c;其中k满足k < m n。选出来的数字在创建的最大数里面的位置…...

ModbusTCP服务端

1在Device下&#xff0c;添加设备net&#xff1a; 公交车。 2在net下添加 ModbusTCP...

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN)

文章目录 1、服务概述1.1 HDFS1.1.1 架构解析1.1.1.1 Block 数据块1.1.1.2 NameNode 名称节点1.1.1.3 Secondary NameNode 第二名称节点1.1.1.4 DataNode 数据节点1.1.1.5 Block Caching 块缓存1.1.1.6 HDFS Federation 联邦1.1.1.7 Rack Awareness 机架感知 1.1.2 读写操作与可…...

Matlab图像处理-从RGB转换为HSV

从RGB转换为HSV HSV彩色系统基于圆柱坐标系。从RGB转换为HSV需要开发将(笛卡儿坐标系中的)RGB值映射到圆柱坐标系的公式。多数计算机图形学教材中已详细推导了这一公式&#xff0c;故此处从略。 从RGB转换为HSV的MATLAB函数是rgb2hsv&#xff0c;其语法为&#xff1a; hsv_imag…...

iOS Error Domain=PHPhotosErrorDomain Code=3300

AVCapturePhoto的数据保存到 PHPhotoLibrary的时候报错Error DomainPHPhotosErrorDomain Code3300解决代码&#xff08;也可以使用addResourceWithType:data:options:来添加数据到request&#xff0c;JEPG的实测可以&#xff0c;raw的不确定&#xff09;&#xff1a; [PHPhoto…...

LeetCode(力扣)435. 无重叠区间Python

LeetCode435. 无重叠区间 题目链接代码 题目链接 https://leetcode.cn/problems/non-overlapping-intervals/ 代码 class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:if not intervals:return 0intervals.sort(keylambda x: x[0])co…...

opencv c++实现鼠标框选区域并显示选择的图片区域

OpenCV可以使用setMouseCallback设置鼠标事件的回调函数,从而然后根据需要进行处理。 setMouseCallback原型为: void cv::setMouseCallback(const cv::String& windowName, MouseCallback onMouse, void* userData = 0); 其中,参数说明如下:windowName:窗口名称 onMo…...

Python实现自主售卖机

1 问题 在python中我们常常使用到条件判断&#xff0c;if语句时常见的条件判断语句之一。那么如何使用if语句实现根据情况自动选择商品进行售卖呢&#xff1f; 2 方法 根据if语句执行时从上往下执行的特点&#xff0c;使用if语句、dict和list来实现整个流程。 代码清单 1 drink…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

验证redis数据结构

一、功能验证 1.验证redis的数据结构&#xff08;如字符串、列表、哈希、集合、有序集合等&#xff09;是否按照预期工作。 2、常见的数据结构验证方法&#xff1a; ①字符串&#xff08;string&#xff09; 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...