golang基础 | 青训营笔记

112 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

猜数字

修改第一个例子猜谜游戏里面的最终代码,使用 fmt.Scanf 来简化代码实现

func main() {
    maxNum := 100
    rand.Seed(time.Now().UnixNano())
    secretNumber := rand.Intn(maxNum)
    // fmt.Println("The secret number is ", secretNumber)

    fmt.Println("Please input your guess")
    for {
        var guess int
        _, err := fmt.Scanf("%d", &guess)
        if err != nil {
            fmt.Println("An error occured while reading input. Please try again", err)
            continue
        }
        fmt.Println("You guess is", guess)
        if guess > secretNumber {
            fmt.Println("Your guess is bigger than the secret number. Please try again")
        } else if guess < secretNumber {
            fmt.Println("Your guess is smaller than the secret number. Please try again")
        } else {
            fmt.Println("Correct, you Legend!")
            break
        }
    }
}

文档中对scanf的解释是: func Scanf(format string, a ...interface{})(n int, err error) 利用scanf可以从标准输入扫描文本,根据format参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

修改后运行代码查看结果 2022-05-08-09-53-30-image.png

当输入字符串时错误信息被多次打印了且数量等于字符串中非数字个数,猜测原因是scanf当扫描到输入流中第一个字符时发现不能转化为数字,就会返回错误信息,并在下一次读取时读下一个字符直到读取到数字。

容易想到的解决方法是用scanfln读取一行再转化为数字 2022-05-08-10-11-59-image.png

添加翻译引擎

修改第二个例子命令行词典里面的最终代码,增加另一种翻译引擎的支持

添加火山翻译,找到翻译api,复制cURL命令,到Convert curl commands to code网站转换成go语言请求代码,并找到请求体格式和响应数据格式利用oktools工具将json转化成go结构体

2022-05-08-10-55-25-image.png

2022-05-08-10-57-52-image.png 翻译结果:

2022-05-08-11-29-26-image.png

并行请求提高翻译速度

在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度

go通过goroutine提供并发,使用go func的方式就可以简单创建一个协程,这里采用sync.WaitGroup方式使得主线程等待两个翻译线程执行完毕

func main() {
    if len(os.Args) != 2 {
        fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
        `)
        os.Exit(1)
    }
    word := os.Args[1]
    var wg sync.WaitGroup
    wg.Add(2)
    go func(word string) {
        queryByCaiYun(word)
        wg.Done()
    }(word)
    go func(word string) {
        queryByHuoShanDao(word)
        wg.Done()
    }(word)
    wg.Wait()

}

结果:

Snipaste_2022-05-08_12-40-53.png

协程和线程:协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源。协程和线程是一对多的关系,创建一个线程,必须进行操作系统调用,而协程不需要,比线程要轻量的多。