go初入门的第一次作业 | 青训营

115 阅读2分钟

1、使用fmt.Scanf来简化代码实现

Scanf,Scan,Scanln三者的区别

Scanf,Scan,Scanln皆为fmt标准库中的扫描函数,但他们之间有一定区别

  1. scan识别换行符
  2. scanln不识别换行符
  3. scanf需要传入格式化的字符串参数

问题

这导致在使用过程中的一些问题,

  1. 换行符的处理,因为windows系统中的换行符为"\r\n",如果不标注出来,可能会出现,判断输入类型和指定类型不符合,值为类型的默认值情况。
  2. 其次由于读取的是数字字符,倘若出现字符长度长于数字的错误输入(例如汉字),但又没读取到换行,因此也会出现前面的问题。

处理

因此在处理过程中,要对于以上两点进行考虑

  1. 如果使用fmt.Scanf的话,记得使用"%d\r\n",简单一点的方法,就是直接fmt.Scan。
  2. 对于错误输入,发生错误后,将这一行剩下的所有字符全部读取,直接到下一行。

核心代码

    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()