这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
学到了一个写文章的新思维,以问题为脉络写下这篇文章
为什么要学习go语言?它的特点是?
-
字节使用go的原因
- web后端,最开始的服务都是python的大概从2014年开始,随着业务体量的增长,python遇到—些性能问题。
- —些团队初步尝试使用了Go,入门很简单,开发效率高,性能也比较好。
- go的开发和部署简单,解决了之前python带来的很头疼的依赖库版本问题.
- —些业务尝到甜头之后,公司级大力推广,诞生了公司内部的基于golang的rpc和http框架。
- 随着框架的推广,越来越多的python服务使用golang重写,至今为止,golang已经成为内部使用率最高的编程语言
-
go的特点
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
go有哪些重要的的基础语法?
-
切片
切片不同于数组可以任意更改长度,然后也有更多丰富的操作。比如说我们可以用make来创建一个切片,可以像数组一样去取值,使用append来追加元素。注意append 的用法的话,你必须把append的结果赋值为原数组。 因为 sice的原理实际上是它有一个它存储了一个长度和一个容量,加一个指向一个数组的指针,在你执行append操作的时候,如果容量不够的话,会扩容并且返回新的slive.slice 此初始台化的时候也可以指定长度。 slice拥有像python一样的切片操作,比如这个代表取出第二个到第五个位置的元素,不包括第五个元素。不过不同于python,这里不支持负数索引
-
函数
这个是Golang 里面一个简单的实现两个变量相加的函数。Golang 和其他很多语言不一样的是,变量类型是后置的。 Golang里面的函数原生支持返回多个值。在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息。
-
错误处理
在go语言里面符合语言习惯的做法就是使用—个单独的返回值来传递错误信息。 不同于Java自家使用的异常。go语言的处理方式,能够很清晰地知道哪个函数返回了错误,并且能用简单的if else 来处理错误.在函数里面,我们可以在那个函数的返回值类型里面,后面加一个error,就代表这个函数可能会返回错误。 那么在函数实现的时候,return需要同时 return两个值,要么就是如果出现错误的话,那么可以return il和一个error。如果没有的话,那么返回原本的结果和nil.
-
进程信息
在go里面,我们能够用os.argv来得到程序执行的时候的指定的命令行参数。 比如我们编译的一个二进制文件,command。后面接abcd 来启动,输出就是os.argv会是一个长度为5的slice,第一个成员代表二进制自身的名字。我们可以用os.getenv来读取环境变量。
5.其他关于json以及时间处理和字符串处理较简单,使用时查一查就可以。
如何用go发出http请求,解析json?
以在线词典这个项目为例 用户可以在命令行里面查询一个单词。我们能通过调用第三方的API查询到单词的翻译并打印出来。
-
项目流程
- 抓包
- 代码生成(将curl转换为go语言)
- 生成request_body
- 解析response_body
- 打印结果,完善代码
-
项目难点
- 抓包过程中很难找到哪一个是request的包,有些翻译引擎的api暴露的少,难找到
- 记得检查状态码
statuecode=200才算正常
-
总体的内容为
- import导入依赖
- 定义request的结构
- 定义request所实现的功能
- 定义response的结构
- 编写main函数
-
自己实现的火山翻译总体代码
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
)
type DictRequest struct {
Language string `json:"language"`
Text string `json:"text"`
}
type DictResponse struct {
Words []struct {
Source int `json:"source"`
Text string `json:"text"`
PosList []struct {
Type int `json:"type"`
Phonetics []struct {
Type int `json:"type"`
Text string `json:"text"`
} `json:"phonetics"`
Explanations []struct {
Text string `json:"text"`
Examples []struct {
Type int `json:"type"`
Sentences []struct {
Text string `json:"text"`
TransText string `json:"trans_text"`
} `json:"sentences"`
} `json:"examples"`
Synonyms []interface{} `json:"synonyms"`
} `json:"explanations"`
Relevancys []interface{} `json:"relevancys"`
} `json:"pos_list"`
} `json:"words"`
Phrases []interface{} `json:"phrases"`
BaseResp struct {
StatusCode int `json:"status_code"`
StatusMessage string `json:"status_message"`
} `json:"base_resp"`
}
//func main() {
func query(word string) {
client := &http.Client{}
request := DictRequest{Language: "en", Text: word}
buf, err := json.Marshal(request)
if err != nil {
log.Fatal(err)
}
var data = bytes.NewReader(buf)
//var data = strings.NewReader(`{"text":"approximate\n","language":"en"}`)
req, err := http.NewRequest("POST", "https://translate.volcengine.com/web/dict/match/v1/?msToken=&X-Bogus=DFSzKwVOQDcARAc1SWs6ee9WX7ra&_signature=_02B4Z6wo00001atvtXgAAIDBK21POxulbEmrf7HAAAiu7Z32Y167xfG2Rv9-KDnGZwZFHqh7M937N6S68s-AEAdcqPs2xqciynZhr9EReHL4VUTgPWkRL7SiwW6Clc4OytshaNGzg6uCn-AC72", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("authority", "translate.volcengine.com")
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
req.Header.Set("content-type", "application/json")
req.Header.Set("cookie", "x-jupiter-uuid=16519369366443564; ttcid=038f495dfb5946ca8dd66b5e2e5c462218; tt_scid=JRX7ECB9koAWjEUuM3dMCoL1FHgkYYlHCwF6OgOkMWO8fRYOzgrESUAX2TNAiNPQ343e; s_v_web_id=verify_290b3ec6615a8f42fd825394e0192140; _tea_utm_cache_2018=undefined; i18next=translate")
req.Header.Set("origin", "https://translate.volcengine.com")
req.Header.Set("referer", "https://translate.volcengine.com/translate?category=&home_language=zh&source_language=detect&target_language=zh&text=approximate%0A")
req.Header.Set("sec-ch-ua", `" Not A;Brand";v="99", "Chromium";v="101", "Microsoft Edge";v="101"`)
req.Header.Set("sec-ch-ua-mobile", "?1")
req.Header.Set("sec-ch-ua-platform", `"Android"`)
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-site", "same-origin")
req.Header.Set("user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Mobile Safari/537.36 Edg/101.0.1210.32")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
if resp.StatusCode != 200 {
log.Fatal("bad StatusCode:", resp.StatusCode, "body", string(bodyText))
}
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse)
if err != nil {
log.Fatal(err)
}
for _, item := range dictResponse.Words {
for _, polist := range item.PosList {
for _, explanation := range polist.Explanations {
fmt.Println(explanation.Text)
//fmt.Println(explanation.Examples)
}
}
}
}
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
`)
os.Exit(1)
}
word := os.Args[1]
query(word)
}
-
运行结果
PS D:\go_project\src\go-by-example-master\simpledict\work> go run "d:\go_project\src\go-by-example-master\simpledict\work\work_1.go" simple
简单的,容易的;单纯的;纯粹的;简朴的,淳朴的;谦逊的,不矫揉造作的;单一的,非合成的;[数学]没有子群的;[生物学]单枝的,单叶的;(英语语法)简单的(时态);单镜头
的;(利息)单利的;愚蠢的
草药
简单!(表示直截了当)