Go 语言入门指南:基础语法和常用特性解析(实践)|青训营

65 阅读1分钟

使用go实现在线词典

Step 1: 抓包

通过preview,确定cURL,在terminal中运行,成功返回一串json

Step 2: 代码生成

使用curlconverter 工具,通过cURL生成代码(curlconverter.com/go/)

生成的代码包括一下几个部分

  1. 创建请求
req, err := http.NewRequest("POST", "<https://fanyi.baidu.com/sug>", data)
  1. 设置请求头
req.Header.Set("Accept", "application/json, text/javascript, */*; q=0.01")
req.Header.Set("Accept-Language", "en-US,en;q=0.9")
  1. 发起请求
resp, err := client.Do(req)
  1. 读取响应
bodyText, err := io.ReadAll(resp.Body)

如果发起请求时由于DNS解析失败或者断网,则返回的err不是nil,会直接退出进程

拿到response之后第一时间使用defer手动关闭这个流,避免资源泄露

defer会在函数结束之后由下至上触发

Step 3: 运行之后,成功打印出JSON,但是还未能实现可变输入

需要用到JSON序列化 → 构造相应结构体 → 初始化结构体变量各个字段→ 使用json.Marshal(request) 序列化返回bytes数组,不是真正字符串

Step 4: 解析response body (反序列化)

也需要构造结构体,再进行反序列化

手动一一对应构造结构体繁琐且容易出错——解决方法:使用json to go工具(oktools.net/json2go)

将浏览器中preview的json字符串copy到网页中,转换生成,转换嵌套,可以使生成的结构体更加简洁

  • 创建新的DictResponse变量
  • 使用json.Unmarshal(bodyText, &dictResponse) 进行反序列化
  • 注意要在dictResponse 前加&符号,才能写入这个结构体
  • 使用fmt.Printf("%#v\n", dictResponse) 来打印response,"%#v\n" 是打印最详细的结果
  • 可以只打印我们想要展示的字段
  • 展示报文,方便诊断问题
if resp.StatusCode != 200 {
		log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
	}
  • 输入的字符串通过query函数的参数传进来
  • 新的main函数