GO语言工程实践课后作业:实现思路、代码以及路径记录 | 青训营

127 阅读3分钟

前言

这次课后作业大概的内容是:
1.修改第一个例子猜谜游戏中的最终代码,使用fmt.Scanf来简化代码实现
2.修改第二个例子命令行词典中的最终代码,增加另一种翻译引擎的支持
3.在上一步骤的基础上,修改代码实现并行请求两个翻译引擎来提高响应速度

猜谜游戏

1.实现思路

课程中的思路是:通过rand生成随机数;再用生成随机数种子的方式使得每次生成的数都不一样(这一步我也不是很懂);后读取用户输入的数(可以有多种方式);再实现逻辑判断,提示用户猜的数是太大还是太小;最后是实现循环,使得猜数猜错时不断进行到猜对为止

2.修改后的代码

package main  
import (  
    "fmt"  
    "math/rand"  
    "time"  
)  
func main() {  
    maxNum := 100  
    var num int  
    rand.Seed(time.Now().UnixNano())  
    secretNumber := rand.Intn(maxNum)  
    // fmt.Println("The secret number is ", secretNumber)   
    for {  
        fmt.Println("Please input your guess")
        _, err := fmt.Scanf("%v\n", &num)  
        if err != nil {  
        fmt.Println("Invalid input. Please enter an integer value")  
        fmt.Scanf("%v\n", &num)  
        continue  
        }  
        fmt.Println("You guess is", num)  
        if num > secretNumber {  
        fmt.Println("Your guess is bigger than the secret number. Please try again")  
        continue  
        } else if num < secretNumber {  
        fmt.Println("Your guess is smaller than the secret number. Please try again")  
        continue  
        } else {  
        fmt.Println("Correct, you Legend!")  
        break  
        }  
    }  
}

3.实现截图

8217caf53ee573087e75ab86c341d6b.png

4.注意点

这里有段代码起着重要的作用:

 _, err := fmt.Scanf("%v\n", &num)  
        if err != nil {  
        fmt.Println("Invalid input. Please enter an integer value")  
        fmt.Scanf("%v\n", &num)  
        continue  
        }  

它的作用是将用户每次输入的数解析为整数,如果错误,就提示;而这里fmt.Scanf("%v\n",&num)的作用是清空输入缓存区,避免继续提示解析错误。

词典

思路

1.抓包:到翻译网站后按F12进入开发者模式;点击翻译,network找到dict检查respondse
2.代码生成:右键dict-Copy URL到网站 curlconverter.com/go#生成代码,复制到文件中
3.解析response:oktools.net/json2go/复制到这个网站生成结构体复制到文件中
4.通过cmd命令窗口运行go文件

修改后的代码:

由于没有找到百度翻译中相应的dict,直接找了个类似有内容的进行操作,后面验证是正确的,就是在结构体找不到英标等几个要求输出的。

1690817634850.jpg 这里的运行结果只能运行出来彩云翻译,百度翻译的因为结构体内容实在找不出来,就随便替换了一个上去(这里也没显示),代码编译器复制过来太长了,就直接给结果吧。

并行翻译

在 Go 语言中,可以使用 goroutines 来实现并行请求两个函数。使用go标准库sync里的var wg sync.WaitGroup并行执行两个翻译函数。

结语

总的来说,猜谜游戏并不是很难理解,主要还是看在命令翻译这一块,可能是我的知识面太窄,还接触不到这些知识,对于我来说难度飙升,在线上问别人也不能找出问题,卡了一整天,一直在翻别人的案例(找不到代码,找到了也是不全面或是生成的代码不一样),只能自己体悟,还有就是并行翻译这一块完全不懂,争取后面把它搞懂。