这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1.猜谜游戏
1.1 项目难点
a.随机数的使用
若直接使用rand.Intn() 会导致生成的随机数是一样的,接着查看文档会发现系统每次都会先用Seed函数初始化系统资源,如果用户不提供seed参数,则默认用seed=1来初始化,这就是为什么每次都输出一样的值的原因,而且,Seed方法是并发安全的。
所以应该使用时间戳来随机种子数序列(引入时间戳需要在包中引入time)。代码如下:
rand.Seed(time.Now().UnixNano())
b.去除输入数字后的\r\n
因为输入的数字是字符串且以\r\n结尾,因此需要去除,采用如下代码
input,err := reader.ReadString('\n') //输入一个数字之后会读取到一个换行符表示读取结束
if err != nil{
fmt.Println("An error occured while reading input. Please try again",err)
continue
}
input = strings.TrimSuffix(input,"\r\n") //去掉输入的空格符和换行符
2.词典排序
2.1 项目难点
a.获取请求接口格式
在翻译栏输入单词后点击翻译,然后点击检查中的网络,找到请求类型为POST的dict,接着右键单击dict,点击赋值cURL(bash),然后复制到Convert curl command上获取请求的格式。
Convert curl commands to Go (curlconverter.com)
b.获取查询后的JSON结构体
因为网络中的一个JSON结构体非常复杂,自己定义十分容易出错,因此需要点击网络中的预览,复制内容到网站JSON转Golang Struct - 在线工具 - OKTools即可获得JSON的结构体,从而可以通过对象引用的方式来打印其中的内容。
c.正确打印JSON内容
首先要定义一个变量用于定义一个请求字段,请求字段也需要定义一个结构体。然后再使用Marshal解析。由于获取的是字符数组,所以需要使用bytes.NewReader(buf),然后将data放入http请求中即可完成请求。
request := DictRequest{TransType: "en2zh",Source: word}//定义了一个请求字段
buf,err := json.Marshal(request) //将这个请求字段json化至
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf)//注意这里不再使用strings,而是使用bytes,因为获取的是字节数组而不是直接的字符串
req, err := http.NewRequest("POST","https://api.interpreter.caiyunai.com/v1/dict",data)
获取了查询单词的结构体之后,需要定义一个该结构体变量类型,使用反序列化将其填入这个变量中,然后逐级获取其中的变量即可。
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)