Go 语言的实战案例 | 青训营笔记

183 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
今天来分析实战的前两个简单一点的案例 案例代码仓库
课程链接 Go 语言的实战案例 - 掘金 (juejin.cn)

猜谜游戏

随机数生成

与Java生成随机数一样,需要有一个随机数种子,一半是利用当前时间 rand.Seed(time.Now().UnixNano())
然后生成随机数 secretNumber := rand.Intn(maxNum)

读取用户输入

用bufio.NewReader将文件转为reader变量,并且用它的ReadString方法根据换行符来读取一行,然后需要去掉换行符,并且利用strconv.Atoi()将输入的字符串转化为数字

reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
//中间的错误检测省略掉了
input = strings.Trim(input, "\r\n")

guess, err := strconv.Atoi(input)

逻辑判断

将guess变量的值与生成的随机数secretNumber进行比较,最后加上循环即可

在线词典

在命令行里面查询一个单词,通过调用第三方的API查询后,返回单词的音标和翻译并打印出来

抓包

以[彩云小译]fanyi.caiyunapp.com/ 提供的服务为例,打开网页,找到开发者工具,点击Network

image.png

image.png

代码生成

上面的请求很复制,单纯用代码构造很麻烦,我们可以利用右键copy as curl,然后粘贴到终端,可以得到json代码

image.png

image.png 利用Convert curl commands to code (curlconverter.com)可以将curl转化成对应的代码

image.png 生成的代码分为创建请求、设置请求头、发起请求、读取响应几部分

读取命令行中输入的单词与前一个猜谜游戏差不多,便不再赘述了。这时候我们已经可以利用命令行返回请求了,只不过这时候返回的请求还没有解析 image.png

生成Request Body

在Go中通常利用结构体与需要生成的JSON的结构一一对应,以方便管理

image.png 然后将

var data = strings.NewReader(`{"trans_type":"en2zh","source":"good"}`)
req, err := http.NewRequest("POST","https://api.interpreter.caiyunai.com/v1/dict", data)

变为

request := DictRequest{TransType: "en2zh", Source: "good"}
buf, err := json.Marshal(request) // 序列化

var data = bytes.NewReader(buf)
req, err := http.NewRequest("POST","https://api.interpreter.caiyunai.com/v1/dict", data)

得到的结果应当不变

解析Response Body

和request一样可以写一个结构体,但是API返回的JSON很复杂,字节写结构体很容易出错,所以我们可以利用JSON转Golang Struct - 在线工具 - OKTools(在线转换工具)将返回的JSON生成结构体

image.png 然后定义一个response对象,用JSON.unmarshal反序列化到结构体

defer resp.Body.Close()  // 结束时close连接
bodyText, err := ioutil.ReadAll(resp.Body)
if err != nil { // 检查err
	log.Fatal(err)
}
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse)// 反序列化
if err != nil {
	log.Fatal(err)
}

打印特定字段

// 先打印音标
fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
// 然后打印词语的解释
for _, item := range dictResponse.Dictionary.Explanations {
	fmt.Println(item)
}

最后可以完善一下代码,用main函数调用刚才实现的调用API的函数,并且在API中做一些检查,即可。

运行结果

image.png

青训营笔记

Go语言基础语法 | 青训营笔记 - 掘金 (juejin.cn)