这是我参与「第三届青训营 -后端场」笔记创作活动的的第二篇笔记
《golong基础篇:在线词典》
一、从翻译器中获取Json数据
进入‘彩云翻译’中获取json数据,流程图如下:
当复制好之后,进入终端,将内容拷贝进去,会出现一大串json数据
进入curlconverter.com/ ,将终端当中复制的json数据拷贝入其中,并将语言选为Go
将显示出来的go代码拷贝到编辑器当中
二、格式化json数据
当把代码拷贝至编辑器,运行后的结果为一长串json数据,很明显的看出这种格式不是我们所需要的,故而需要将其格式化
type DictRequest struct {
TransType string `json:"trans_type"`
Source string `json:"source"`
UserID string `json:"user_id"`
}
创建一个结构体。trans_type为,source为需要转换的单词,user_id为用户的id
request := DictRequest{TransType: "en2zh", Source: "good"} //初始化结构体当中的参数
buf, err := json.Marshal(request) //序列化json字符串
初始化结构体当中的成员参数,并使用json.Marshal()来序列化json字符串
var data = bytes.NewReader(buf)
因为这是一个字节数组,所以需要使用bytes.NewReader()来构造序列化后的字符串(注:修改后需要将import中多余的包删掉)
三、解析response body
进入oktools.net/json2go ,运行前面写出的程序,将结果的json字符串拷贝进该网站,可以自动生成相应的结构体
将得到的结构体拷贝到编辑器当中,并初始化该response结构体
var dictResponse DictResponse //初始化response结构体
err = json.Unmarshal(bodyText, &dictResponse) //反序列化body中的数据
使用json.Unmarshal()来反序列化body当中的json数据
四、获取结果并完善
从json中获取Dictionary.Explanations中的数据,使用for range循环来获取
if resp.StatusCode != 200 {
log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
}
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)
}
该主函数是重新写的一个,之前的主函数修改为query(word),并将其设定一个String型的参数,用来表示需要翻译的数据。
展示效果如上,输入一个词,便能够翻译出对应的结果。但是有一处地方值得注意:在GOPATH中,需要有当前工程对应的目录及内容,并且需要在终端运行,才能在工程运行之初能够有参数,运行指令也需要多留心。