Go语言入门及实战案例笔记 | 青训营笔记

50 阅读6分钟

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


一、Go语言基础入门

 1. 什么是 Go 语言 

1)高性能、高并发

2)语法简单、学习曲线平缓 

3)丰富的标准库 

 4)完善的工具链 

 5)静态链接 

 6)快速编译 

 7)跨平台 

 8)垃圾回收 

 2. 配置环境 

 1)安装Golang 

 ✨ go.dev/ 

 ✨ studygolang.com/dl 

 ✨ goproxy.cn/ 

 ✨ 改安装路径,一致next 

 2)配置集成开发环境(IDE) 

 ✨ Goland 

 ✨ VSCode 免费 

 ✨ 基于云的开发环境: 

 🌹 gitpod.io/#github.com…

 🌹 短链接: hi-hi.cn/gitpod 

 3. 基础语法 

1)package main:代表这个文件属于 main 包的一部分,main 包也就是程序的入口包。 

2)导包 import{ “包名” } 

3)main函数 func main(){ ... } 

  1. 变量 

 ✨ go语言是一门强类型的语言,每一个变量都有自己的变量类型 

 ✨ 常见的类型:字符串、整型、浮点型、布尔类型... 

 ✨ 变量声明方式 

 🌹 var 变量名 = 变量值 :这种方式声明变量会自动去推导变量类型 

 🌹 变量名 := 变量值 

5)常量 

 ✨ 把 var 改为 const 

 ✨ 常量没有确定类型,会根据上下文来自动确定类型 

 6)分支语句 if 条件表达式 { ... } else if 条件表达式 { ... } else { ... } 

 ✨ 条件表达式不需要小括号 

 ✨ 后边必须接 大括号 {},不能省略 

 7)循环 

 ✨ 唯一的循环 for 

 ✨ 死循环(不写条件语句) for{ } 

 ✨ 经典写法(三段任一都可以省略) for 变量初始化语句;条件判断语句;迭代语句 { } 

 ✨ 可以使用 break continue 

 8)switch 

 ✨ 经典格式 switch 变量名{ case 值1: ... case 值2: ... case 值3: ... ... default: ... } 

 ✨ 注意:不需要加 break,程序也不会往下跑 

 ✨ switch 后边可以吧加任何变量,然后在 case 里边写条件分支,替代多个 if else 

 9)数组   

✨ 定义 

 🌹 var 数组名[数组大小] 数组的类型 

 🌹 数组名 := [数组大小] 数组类型{1,2,3,4...} 【大括号里边是初始化的值】 

 ✨ 赋值 数组名[索引] = 值 

 10)切片(变长数组) 

 ✨ 定义 切片名 := make([]类型,长度 ) 

 ✨ 赋值 切片名[索引] = 值 

 ✨ 添加元素的方法 切片名 = append(切片名,值1,值2...) //值可以添加 1 个或者 多个 

 ✨ 求长度 长度 = len(切片名)

 ✨ 取出元素 切片名[左索引(包含),右索引(不包含)] 

 11)map 

 ✨ 定义

 🌹 map名 := make(map[键类型]值类型) 

 🌹 map名 := map[键类型]值类型{键1:值1, 键2:值2, ...}

 🌹 var map名 = map[键类型]值类型{键1:值1, 键2:值2, ...} 

 ✨ 赋值 map名[键] = 值 

 ✨ 取值 返回值名,取值状态名 := m[键] //取值状态,即取值成功与否 

 ✨ 删除 delete(map名,键) 

 ✨ golang 的 map 是完全无序的 

 12)range 

 ✨ 对于 slice 或 map ,range 可以实现快速遍历 

 ✨ 代码格式 for 要接收的值 := range 待遍历的集合名字 { //要接收的值的数量可以自定义 ... }

 ✨ 对于数组会返回两个值,第一个是索引,第二个是对应位置的值。如果我们不需要索引的话,我们可以用下划线来忽略 

 13)函数 

 ✨ 格式 func 函数名(参数名1 参数类型1,参数名2,参数类型2)返回值类型{ 函数体 } 

 ✨ 变量类型后置 

 ✨ Golang 函数支持多个返回值 例:第一个返回结果,第二个返回错误信息 

 14)指针 

 ✨ & :取地址 

 ✨ * :指针声明、解引用 

 15)结构体 

 ✨ 定义 type 结构体名 struct { 成员变量1 类型 成员变量2 类型 } 

 ✨ 成员方法 func (变量名 结构体类型名) 函数名(参数名 参数类型)返回类型 { 函数体 } 16)错误处理 

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

 ✨ error.New("错误信息") //错误信息作为返回值返回 

 17)字符串操作 

 ✨ 在标准的 strings 包里面自带有很多常用的字符串工具函数 

 🌹 contains:判断一个字符串里面是否有包含另一个字符串

 🌹 count 字符串计数 

 🌹 index 查找某个字符串的位置 

 🌹 join 连接多个字符 

 🌹 repeat 重复多个字符串 replace 替换字符串 

 🌹 例:strings.函数名() 

 18)字符串格式化 

 ✨ 在标准库的 FMT 包里有很多格式化的函数 

 ✨ 比如在 printf 函数中 

 🌹 %v :可以打印任何类型的变量,不需要区分数字还是字符串

 🌹 %+v:打印详细结果 

 🌹 %#v:更详细 

 19)JSON 处理 

 ✨ 对于一个已有的结构体,我们们可以什么都不做,只要保证每个字段的第一个字母都是大写的,那么这个结构体就能用JSON.marshaler 去席列化,变成一个JSON的字符串 

 ✨ 序列化之后的字符串也能够用JSON.unmarshaler 去反席列化到一个空的变量里面,这样默认席列化出来的字符串的话,它的风格是大写字母开头,而不是下划线 

 20)时间处理 

 ✨ 获取当前时间 time.Now() 

 ✨ 定义时间 time.Date(年,月,日,时,分,秒,毫秒,时区) 

 ✨ 时间戳 time.Now().Unix() 

 21)数字解析 

 ✨ strcov 包 

 ✨ 字符串转int或float:strcov.ParseInt()/ParseFloat() 

 ✨ Atoi: 

 🌹 用 Atoi 把一个十进制字符串转成数字。可以用 itoA 

 🌹 把数字转成字符串。如果输入不合法,那么这些函数都会返回error 

 22)进程信息 

 ✨ os.Args:程序执行的时候直到的命令行参数 

 ✨ os.Getenv(环境变量名):获取环境变量 

 ✨ os.Setenv(环境变量名,值):设置环境变量的值 

 二、Go语言实战案例 

 1. 猜谜游戏 

 1)生成随机数 rand.Seed(time.Now().UnixNano()) 用时间戳初始化随机数种子 

 2)读取用户输入 

 ① reader:ReadString('\n');//读取一行 

 ② strings.TrimSuffx(input,"\n")//吃掉换行符 

 ③ strconv.Atoi(字符串) //字符串转换成数字 

 3)实现判断逻辑:猜测的数字与答案的比较 

 4)实现游戏循环:直到猜对了才退出循环(break) 

 2. 在线词典 

 1) 在线抓包 fanyi.caiyunapp.com/ 检查 -> 点翻译按钮,发一个请求 -> Network(网络)中找到 dict Post请求 -> 简单分析json数据 -> 右键copy -> copy as cURL 

 2) 在线cURL转换成代码 网址:fanyi.caiyunapp.com/ 粘贴,选择语言,自动生成   3)代码执行流程 

 ① 创建请求 req,err := http.newRequest("post","url",data) 

 ② 设置请求头 req.Header.set() 

 ③ 发送请求 resp,err := client.Do(req) 

 ④ 关闭流 

 ④ 读取响应体 ioutil.ReadAll(resp.Body) 

 4)生成request body 

 ① 定义一个相对应的结构体 

 ② 请求序列化 

 5)解析response body 在线生成 oktools.net/json2go 转换嵌套 生成结构体 

 6)检测错误信息,便于维护处理 

 7)完善代码 

 3. SOCKS5 代理介绍 

源代码地址:hi-hi.cn/go

 1)TCP echo server 

 2)auth函数:用于鉴权 

 3)请求阶段 

 4)relay阶段