这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天,今天的学习内容是Go的基础语法及实战案例。
Go语言的优点
- 高性能、高并发
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
高性能、高并发是选择Go语言最重要的一个点。
实战案例
猜谜游戏
猜谜游戏逻辑简单,首先生成一个随机数,然后读入用户输入的数,输出相应结果,直到用户输入数与结果数一致。 生成随机数的方法:
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
使用系统时间戳初始化随机数种子,然后获取随机数,不然每次获取的随机数都是一样的。
课后练习:使用fmt.Scanf简化代码
_, err := fmt.Scanf("%d ", &guess)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
只需要将原本的输入改为上述代码即可。
在线词典
使用go发送http请求给翻译网站并接收返回数据显示到结果目录中。使用net/http包的http类相关函数很容易能实现这个功能。接收到返回的数据之后,使用io.ReadAll进行读取数据,然后建一个对应的结构体使用json.Unmarshal进行转换,最后输出。
课程代码中使用的是ioutil.ReadAll,git到本地之后在GoLand上有提示已弃用就修改为了io.ReadAll
课后练习:使用另一个翻译引擎并并发进行翻译。
使用了百度翻译引擎进行了翻译。
首先通过视频方法获取到url,如下
req, err := http.NewRequest("POST", "https://fanyi.baidu.com/v2transapi?from=en&to=zh", data)
定义对应的结构体转换输出,如下
for _, res := range ans.TransResult.Data {
fmt.Println("百度翻译结果:" + res.Dst)
}
注:百度翻译的json好像里面还有例句之类的,导致结构体非常的大,不太清楚是不是自己找错了
然后运行两个协程来跑两个查询函数,使用wg sync.WaitGroup来保证所有携程结束之后才结束主程序。
两个子线程中,my_query的查询比较慢(怀疑跟上述说的json包含东西太多有关),基本上每次query携程跑完my_query也不会跑完,所以如果将query放到携程,my_query在主线程也不会有啥影响(应该是这样)
SOCKS5代理
暂时不是很清楚,以后明白了再写。