后端 go day1 | 青训营笔记

78 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

今天学习的内容为go语言基础

背景

2007年, google的大佬们由于无法忍受c++语言的复杂度,缓慢的编译速度等问题, 产生了设计一门新的计算机语言的想法. 他们以c语言为蓝本, 提出的新语言的特性

  • 使用import替代include。
  • 去掉宏(macro)。
  • 理想情况是用一个源文件替代.h和.c文件,模块的接口应该被自动提取出来(而无须手动在.h文件中声明)。
  • 语句像C语言一样,但需要修正switch语句的缺陷。
  • 表达式像C语言一样,但有一些注意事项(比如是否需要逗号表达式)。
  • 基本上是强类型的,但可能需要支持运行时类型。
  • 数组应该总是有边界检查。
  • 具备垃圾回收的机制。
  • 支持接口(interface)。
  • 支持嵌套和匿名函数/闭包。
  • 一个简单的编译器。
  • 各种语言机制应该能产生可预测的代码。 这门语言就是go语言, 经过早期开发后, go语言于2009年公布, 并在同年开源, 随即引来了大量关注, 在当年就被评选为TIOBE年度最佳编程语言. 并在云计算的兴起下, 提出了云原生概念, 一系列基于go构建的应用应运而生, 如Docker, Kubernetes, Istio, Ethereum 等等.

项目拆解

老师讲解了三个案例

  1. 猜字谜游戏
  2. 简单翻译程序, 通过调用api实现
  3. sock5 代理: 解析sock5协议, 转发请求的服务器程序

具体分析案例二翻译程序.

step1: 进入彩云翻译, 在前端页面发送一次请求, 获取http api地址与请求方式, 保存为cURL格式, 再通过工具将 cURL 参数转为 go 程序.

func main() {
	client := &http.Client{}
	data := "..." // request param.
	req, _ := http.NewRequest("POST", "host", data)
	req.Header.Set("key", "val") // ... 设置相关 Header 参数
	resp, _ := client.Do(req)
	defer resp.Body.Close()
	body, _ := ioutil.ReadAll(resp.Body)
	// ... do something with body.
}

step2,3 : 将参数和返回值格式化, (其中返回值由于过于复杂, 可以通过工具解析json生成), 并使用json.Marshal/Unmarshal 序列化与反序列化. step4: 将请求过程抽象为函数, 参数为待翻译文本, 并美化打印, 只输出翻译结果

func query(word string) {
	request := DictRequest{TransType: "en2zh", Source: word}
	buf, _ := json.Marshal(request)
	data := bytes.NewReader(buf)
	// ...
	var dictResponse DictRequest
	_ = json.Unmarshal(body, &dictResponse)
	fmt.Println(...)
}

作业要求增加一种翻译方式, 并并发请求. 我选择火山翻译引擎. curl参数为

curl 'https://translate.volcengine.com/web/dict/detail/v1/' \
  -H 'content-type: application/json' \
  --data-raw '{"source":"youdao","words":["新新人类"],"source_language":"zh","target_language":"en"}' \
  --compressed

先添加请求和响应结构体

  

type VoclRequest struct {
	Source string `json:"source"`
	Words []string `json:"words"`
	SourceLanague string `json:"source_language"`
	TargetLanguage string `json:"target_language"`
}

  

type VoclResponse struct {
	Details []struct {
		Detail string `json:"detail"`
		Extra string `json:"extra"`
	} `json:"details"`
	BaseResp struct {
		StatusCode int `json:"status_code"`
		StatusMessage string `json:"status_message"`
	} `json:"base_resp"`
}
// 二次解析 extra 信息
type VoclExtra struct {
	Explain string `json:"explain"`
	UkPhonetic string `json:"uk_phonetic"`
	UsPhonetic string `json:"us_phonetic"`
}

拷贝原来query, 修改请求参数和响应解析. 利用goroutine + waitgroup并发请求.

结果如下

Pasted image 20230115215608.png

gist 连接: simple dict (github.com)

引用