这是我参与「第五届青训营 」伴学笔记创作活动的第 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
代码生成
上面的请求很复制,单纯用代码构造很麻烦,我们可以利用右键copy as curl,然后粘贴到终端,可以得到json代码
利用Convert curl commands to code (curlconverter.com)可以将curl转化成对应的代码
生成的代码分为创建请求、设置请求头、发起请求、读取响应几部分
读取命令行中输入的单词与前一个猜谜游戏差不多,便不再赘述了。这时候我们已经可以利用命令行返回请求了,只不过这时候返回的请求还没有解析
生成Request Body
在Go中通常利用结构体与需要生成的JSON的结构一一对应,以方便管理
然后将
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生成结构体
然后定义一个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中做一些检查,即可。