Go语言上手基础 | 青训营笔记

209 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

学到了一个写文章的新思维,以问题为脉络写下这篇文章

为什么要学习go语言?它的特点是?

  1. 字节使用go的原因

  • web后端,最开始的服务都是python的大概从2014年开始,随着业务体量的增长,python遇到—些性能问题。
  • —些团队初步尝试使用了Go,入门很简单,开发效率高,性能也比较好。
  • go的开发和部署简单,解决了之前python带来的很头疼的依赖库版本问题.
  • —些业务尝到甜头之后,公司级大力推广,诞生了公司内部的基于golang的rpc和http框架。
  • 随着框架的推广,越来越多的python服务使用golang重写,至今为止,golang已经成为内部使用率最高的编程语言
  1. go的特点

  • 高性能、高并发
  • 语法简单、学习曲线平缓
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
  • 快速编译
  • 跨平台
  • 垃圾回收

go有哪些重要的的基础语法?

  1. 切片

QQ截图20220510215411.png

切片不同于数组可以任意更改长度,然后也有更多丰富的操作。比如说我们可以用make来创建一个切片,可以像数组一样去取值,使用append来追加元素。注意append 的用法的话,你必须把append的结果赋值为原数组。 因为 sice的原理实际上是它有一个它存储了一个长度和一个容量,加一个指向一个数组的指针,在你执行append操作的时候,如果容量不够的话,会扩容并且返回新的slive.slice 此初始台化的时候也可以指定长度。 slice拥有像python一样的切片操作,比如这个代表取出第二个到第五个位置的元素,不包括第五个元素。不过不同于python,这里不支持负数索引

  1. 函数

函数.png

这个是Golang 里面一个简单的实现两个变量相加的函数。Golang 和其他很多语言不一样的是,变量类型是后置的。 Golang里面的函数原生支持返回多个值。在实际的业务逻辑代码里面几乎所有的函数都返回两个值,第一个是真正的返回结果,第二个值是一个错误信息。

  1. 错误处理

错误处理.png

在go语言里面符合语言习惯的做法就是使用—个单独的返回值来传递错误信息。 不同于Java自家使用的异常。go语言的处理方式,能够很清晰地知道哪个函数返回了错误,并且能用简单的if else 来处理错误.在函数里面,我们可以在那个函数的返回值类型里面,后面加一个error,就代表这个函数可能会返回错误。 那么在函数实现的时候,return需要同时 return两个值,要么就是如果出现错误的话,那么可以return il和一个error。如果没有的话,那么返回原本的结果和nil.

  1. 进程信息

进程信息.png

在go里面,我们能够用os.argv来得到程序执行的时候的指定的命令行参数。 比如我们编译的一个二进制文件,command。后面接abcd 来启动,输出就是os.argv会是一个长度为5的slice,第一个成员代表二进制自身的名字。我们可以用os.getenv来读取环境变量。

5.其他关于json以及时间处理和字符串处理较简单,使用时查一查就可以。

如何用go发出http请求,解析json?

以在线词典这个项目为例 用户可以在命令行里面查询一个单词。我们能通过调用第三方的API查询到单词的翻译并打印出来。

  1. 项目流程

  • 抓包
  • 代码生成(将curl转换为go语言)
  • 生成request_body
  • 解析response_body
  • 打印结果,完善代码
  1. 项目难点

  • 抓包过程中很难找到哪一个是request的包,有些翻译引擎的api暴露的少,难找到
  • 记得检查状态码

不要忘记检查状态码.png statuecode=200才算正常

  1. 总体的内容为

  • import导入依赖
  • 定义request的结构
  • 定义request所实现的功能
  • 定义response的结构
  • 编写main函数

main函数.png

  1. 自己实现的火山翻译总体代码



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)
}
  1. 运行结果

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
简单的,容易的;单纯的;纯粹的;简朴的,淳朴的;谦逊的,不矫揉造作的;单一的,非合成的;[数学]没有子群的;[生物学]单枝的,单叶的;(英语语法)简单的(时态);单镜头 
的;(利息)单利的;愚蠢的
草药
简单!(表示直截了当)

最后还有一个实验没时间做了 唉,后面补上!!!