本文介绍一个简单的go命令行字典练习项目 适合初学者练习 涉及http包、flag包、boltdb数据库的使用
翻译API使用百度翻译API
第一步:
在百度翻译注册,获得开发者pid和密钥 (替换)
第二步:
开通通用翻译服务!!(如果没有开通 返回消息会报错无效的用户)
注意:其中的ip地址无须填写 否则只能请求一次需重新修改
第三步:
打开百度翻译API开发者文档 通用翻译
其中需按要求拼接字符串 然后可以使用go中的md5进行加密 封装加密函数
其他按要求填写对应GET请求或者POST请求的参数 这里我使用的是POST请求
因为返回的响应是json格式 可以使用在线json转struct网站生成一个对应的结构体保存响应消息
第四步:
编写代码 使用flag包获取命令行参数
完整代码如下 :
package main
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strconv"
"time"
)
//申请的信息 iD和密钥
const (
UerAppID = "20220816001309619"
UerPassword = "*****************"
)
type TranslateModel struct {
Q string
From string
To string
Appid string
Salt int
Sign string
}
type TransResult struct {
Src string `json:"src"`
Dst string `json:"dst"`
}
type TransRespone struct {
From string `json:"from"`
To string `json:"to"`
Trans []TransResult `json:"trans_result"`
}
//初始化一个翻译模块
func NewTranslateModeler(q, from, to string) TranslateModel {
tran := TranslateModel{
Q: q,
From: from,
To: to,
}
tran.Appid = UerAppID
tran.Salt = time.Now().Second()
content := UerAppID + q + strconv.Itoa(tran.Salt) + UerPassword
sign := SumString(content) //计算sign值
tran.Sign = sign
return tran
}
//将对应的请求表单组装好
func (tran TranslateModel) ToValues() url.Values {
values := url.Values{
"q": {tran.Q},
"from": {tran.From},
"to": {tran.To},
"appid": {tran.Appid},
"salt": {strconv.Itoa(tran.Salt)},
"sign": {tran.Sign},
}
return values
}
//计算文本的md5值
func SumString(content string) string {
bys := md5.Sum([]byte(content))
//bys := md5.Sum([]byte(content))//这个md5.Sum返回的是数组,不是切片哦
value := hex.EncodeToString(bys[0:]) //根据数组构造一个切片
return value
}
//百度翻译api接口
var Url = "http://api.fanyi.baidu.com/api/trans/vip/translate"
func main() {
var (
from string
to string
query string
)
// go run .\main.go --from auto --to en --q 你好
flag.StringVar(&from, "from", "auto", "从那个语言翻译过来")
flag.StringVar(&to, "to", "en", "翻译语言")
flag.StringVar(&query, "q", "", "翻译的文本")
flag.Parse()
tran := NewTranslateModeler(query, from, to)
values := tran.ToValues()
resp, err := http.PostForm(Url, values) //调用一个post请求 并且上传表单
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
res := TransRespone{} //初始化一个结构体接收返回消息
body, err := ioutil.ReadAll(resp.Body) //读取响应的响应体
if err != nil {
fmt.Println(err)
return
}
json.Unmarshal(body, &res) //反序列化到struct中
for _, v := range res.Trans { //输出源文本和目标文本
fmt.Println(v.Src)
fmt.Println(v.Dst)
}
}
接下来在运行时带上对应的参数即可 结果如下:
后续可能会使用一些框架拓展一下,其中命令行工具可以使用Cobra
优化点:加入k-v数据库存储boltdb (当用户查询时优先查询数据库 没有则调用API远程查询并且加入数据库)
多次查询加入缓存map ....
后续修改:加入boltdb数据库
代码已上传github GitHub - GalaxyFall/dictionary-go: a simple go dictionary project
后续会继续分享go相关练习和项目代码 如果对你有帮助的话点个赞把!