1、使用fmt.Scanf来简化代码实现
Scanf,Scan,Scanln三者的区别
Scanf,Scan,Scanln皆为fmt标准库中的扫描函数,但他们之间有一定区别
- scan识别换行符
- scanln不识别换行符
- scanf需要传入格式化的字符串参数
问题
这导致在使用过程中的一些问题,
- 换行符的处理,因为windows系统中的换行符为"\r\n",如果不标注出来,可能会出现,判断输入类型和指定类型不符合,值为类型的默认值情况。
- 其次由于读取的是数字字符,倘若出现字符长度长于数字的错误输入(例如汉字),但又没读取到换行,因此也会出现前面的问题。
处理
因此在处理过程中,要对于以上两点进行考虑
- 如果使用fmt.Scanf的话,记得使用"%d\r\n",简单一点的方法,就是直接fmt.Scan。
- 对于错误输入,发生错误后,将这一行剩下的所有字符全部读取,直接到下一行。
核心代码
var guess int
var err error
var buf string
for {
_, err = fmt.Scan(&guess)
if err != nil {
fmt.Println("An error occured while reading input. Please try again")
fmt.Scan(&buf) //读取这一行剩下的所有字符
continue
}
//后面就是比大小环节
}
2、对于字典,增加另一种翻译引擎
考虑到多数翻译引擎的接口可能是无法简单调用的,需要一些爬虫技术,因此可以考虑直接申请一些官方api使用,这里以百度翻译为例
请求体结构
百度翻译api接口采取的不是json解析,而是url编码,因此需要有一些改变
/*请求体结构
q=查询的单词
from=源语言
to=目标语言
appid=个人id,去控制台查看
salt=任意长度字符串
sign=md5(appid+word+salt+key)
*/
var url = "https://fanyi-api.baidu.com/api/trans/vip/translate"
sign := fmt.Sprintf("%x", md5.Sum([]byte(appid+word+salt+key)))
res, err := http.Post(url,
"application/x-www-form-urlencoded",
strings.NewReader(
"q="+word+
"&from=en&to=zh&appid="+appid+
"&salt="+salt+
"&sign="+sign),
)
if err != nil {
log.Fatal(err)
}
解析响应
type Response struct {
From string `json:"from"`
To string `json:"to"`
TransResult []struct {
Src string `json:"src"`
Dst string `json:"dst"`
} `json:"trans_result"`
}
content, err := io.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
}
var Response Response
err = json.Unmarshal(content, &Response)
if err != nil {
log.Fatal(err)
}
fmt.Println(word, "translate:", Response.TransResult[0].Dst)
3、并行请求两个翻译引擎
开个多协程,用锁来协同返回,如果想看对比,还能打印一下时间戳,相互对照一下
var wg sync.WaitGroup
wg.Add(2)
go func() {
BaiduQuery(word)
wg.Done()
}()
go func() {
CaiYunQuery(word)
wg.Done()
}()
wg.Wait()