Go语言基础+实战案例的实践及课后作业记录 | 青训营

70 阅读4分钟

写在前面的一些碎碎念:完全的Go小白,第一次接触,在自学的过程中还是感到了不少困难,但是!万事开头难!学习过程中需要多积累多总结,才能有更多的收获。

1 关于工具的使用

我选择的开发工具是VSCode,跟着一篇很详细的博客完成了开发环境的安装,然后开始跟着课程跑demo代码,在这个过程中遇到了如下问题:

1.1 VSCode无法通过键盘输入进行交互

问题: 在跑猜谜游戏的demo时,发现VSCode的显示如下,怎么也输不了数字进去

1.png

原因: Code Runner插件的设置问题

解决方法: 在“扩展”中搜索“code runner”,找到插件,点击右下方的设置按钮,将“Run in Terminal”选项打钩即可

2.png

3.png

1.2 nc命令使用

问题: 跑socks代码时不会用nc命令

原因: 未安装netcat

解决方法: 安装netcat,参考教程在这,然后运行main.go文件,再点VSCode页面右下方的+,多开一个终端,输入nc....那段代码即可

4.png

1.3 curl命令报错

问题: 在vscode的终端使用curl命令时报错:Invoke-WebRequest : 找不到接受实际参数“127.0.0.1:1080”的位置形式参数

原因: 微软的powershell给自己的Invoke-WebRequest命令设置了curl别名,但Invoke-WebRequest仅仅相当于盗版或是阉割版的curl,很多curl的功能它都没有,所以会报这样的错

解决方法: 要使用原本的curl命令,则将代码的curl改为curl.exe即可

2 作业一

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

2.1 思路

fmt.Scanf是GO语言的键盘输入语句之一,可以按指定的格式输入,示例代码可见此处,也就是将原本代码中的如下两句改一下,并删掉不需要的包即可:

reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')

2.2 代码修改

import中的"bufio""os"删去

reader := bufio.NewReader(os.Stdin)改为var input string

input, err := reader.ReadString('\n')改为_, err := fmt.Scanf("%s \n", &input)

2.3 遇到问题

问题: 按网上查到的资料,将input, err := reader.ReadString('\n')改为_, err := fmt.Scanf("%s", &input)后运行代码,会发现在下一次输入前,会产生一次正确提示输出+一次报错如下:

1.png

原因: 可能是因为第一次读了输入的数字,然后又把回车号当做第二次读入了

解决方法:%s后加上\n即可,也就是改为_, err := fmt.Scanf("%s \n", &input)

3 作业二

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

3.1 思路

在QQ群里看到大佬们推荐了火山翻译来做,所以就依着老师的思路,用火山翻译先复刻了一版单一搜索引擎的。之后,把两种搜索引擎的代码合在一起,就能打印出两种搜索引擎的结果啦。

3.2 遇到问题

1、每个网站相应内容的json结构有些区别,在彩云翻译里我们找的是dict,但是火山中就是一个叫?msToken...的东西,因为不熟练一通好找才找到。

2、火山翻译的words是"words":["hi"]这种格式的,也就是client := &http.Client{}的下面一行是

var data = strings.NewReader(`{"source":"youdao","words":["hi"],"source_language":"en","target_language":"zh"}`)

这导致我一直不太明白怎么写结构体,后来经过查询,这是切片形式,在请求结构体中应该声明为

Words []string `json:"words"`

对应的,函数中的请求代码写为:

request := DictRequest2{Source: "youdao", Words: []string{word}, Source_language: "en", Target_language: "zh"}

别的都和老师的教程基本是一样的啦。

4 作业三

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

4.1 思路

先查找一下go的并行请求实现方式,得到的结果是使用Goroutine起一个并发请求即可,也就是在调用函数时前面加一个go

4.2 实现方式

很简单,原来的main函数中我们要支持两个翻译引擎,势必要分别调用两个函数,原代码为:

func main() {
	...
	query(word)
	query2(word)
}

只需改为

func main() {
	...
	go query(word)
	query2(word)
}

5 总结

没想到第一天的课程就这么有挑战性,从环境安装到作业都遇到了很多问题,期间有束手无策的感觉,但是还是振作起来,通过搜索引擎、QQ群、飞书唠嗑群等等渠道获得了解决的方法。总结下来就是,不要畏难,积极通过各种可用渠道去解决使自己迷惑的问题,然后慢慢进步。