这是我参与「第五届青训营 」伴学笔记创作活动的第 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 等等.
项目拆解
老师讲解了三个案例
- 猜字谜游戏
- 简单翻译程序, 通过调用api实现
- 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并发请求.
结果如下
gist 连接: simple dict (github.com)
引用
- Go语言精进之路:从新手到高手的编程思想、方法和技巧1
- wangkechun/go-by-example (github.com)