Go语言实战案例-工程实践 | 青训营笔记
参加 [第六届青训营] 笔记创作第三篇
本堂课的内容
以3个go语言demo来更深一步去理解go语言的使用:
- 第一个demo是猜谜游戏
- 第二个demo是在线词典
- 第三个demo是scoks5代理
猜谜游戏
随机数的生成
可以看到demo最终示例是在0-100之间猜数的大小,故首先解决一下输入的问题。
go语言跟python类似,只需要在导包的时候导入math/rand包,用maxNum指定随机生成数的范围,后调用包内的函数rand.Intn()即可生成。
这里通过鼠标悬浮的方式去看文档,发现文档对随机数函数的使用是有个注意事项的,在使用函数前需要设置一个随机数种子,否则每次都生成相同的随机数序列。一般惯例是在程序启动的时候用启动的时间戳来初始化随机数种子。修改完之后的随机数生成代码为:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
}
输入的获取
不同于c++的直接scanf或是cin的读入,这里从标准输入所得的方式是使用os的Stdin,但这样读入的是一个文件(?),直接对这个文件操作不方便,所以用bufio的NewReader将其转化为流并命名为reader以方便后面的操作。读取input直到读到换行符'\n'就结束,然后后续对string读入进行Atoi操作之前记得剔除掉不需要的'\n',这样就对键盘输入的猜测数处理好了。
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
return
}
input = strings.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
fmt.Println("You guess is", guess)
实现游戏循环
将整体判断程序写进不需要条件的for循环里面,然后将之前猜测出错就return的地方改为continue,在猜测数判断的环节只有是猜对了才break出循环,否则一直执行。
在线词典
获取请求报文和响应报文的格式和内容
- 打开彩云小译官网。
- 按下F12(或者在任意空白处单击右键,选择检查),此时,会打开浏览器的开发者工具栏。
- 在开发者工具栏的顶部区域,点击网络(如果没有,点击>>可展开更多选项卡,再点击网络)。
- 在网页找到单词翻译框,输入pretty。
- 点击翻译按钮。
- 此时,开发者工具栏更新出许多文件,在筛选器一栏,点击Fetch/XHR,在剩下的文件中,选中dict文件。
为了确认文件就是所需要的请求报文所在的文件,这里选中dict文件之后点击开发者工具栏的负载可以看到如下JSON格式的内容:
然后点击预览:
构造请求报文和响应报文
- 右键单击dict文件,选择复制-复制为cURL(bash)。
- 在浏览器的地址栏输入curlconverter.com/go/,转到该网站。
- 将步骤1复制的文本粘贴到该网站的输入框中,就可以go实现的代码。
改造查询
- 定义与输入JSON内容词条一致的结构体
type DictRequest struct {
TransType string `json:"trans_type"`
Source string `json:"source"`
}
- 初始化结构体对象
request := DictRequest{TransType: "en2zh", Source: "pretty"}
- 将对象序列化为JSON字节流
byteStream, err := json.Marshal(request)
- 将JSON字节流读入data中
var data = bytes.NewReader(byteStream)