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

148 阅读6分钟

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

1.简介

1.1Go语言的优点

  1. 高性能、高并发
    1. 有和cpp、java媲美的性能
    2. 内建了对高并发的支持,直接使用标准库,或者基于标准库的第三方库即可开发第三方应用程序
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
    1. 很多情况下不需要依赖第三方库就可以完成功能的开发
    2. 标准库还很稳定
  4. 完善的工具链
    1. 内置了单元测试框架
  5. 静态链接
    1. 所有的编译结果默认都是静态链接的,直接拷贝编译成功的可执行文件即可进行部署
    2. 部署方便快捷
  6. 快速编译
    1. 拥有静态语言里面最快的编译速度
  7. 跨平台
    1. 可以在windows、linux、macos等平台下运行
    2. 也可以在路由器、树莓派上运行
    3. 交叉编译特性,例子:在笔记本上编译出一个二进制文件,可以直接拷贝到路由器上面运行,无需配置交叉编译环境
  8. 垃圾回收
    1. 和java类似,无需考虑内存的分配释放
    2. 可以专注于业务逻辑

1.2那些公司在使用Go语言

image.png

go语言的应用领域

  1. 云计算
  2. 微服务
  3. 区块链
  4. 物联网
  5. 大数据

在云计算跟微服务上面已经有非常高的市场占有率了

很多云原生组件(docker, k8s, etcd等)很多都是用go语言来实现的

2.入门

2.1搭建go的开发环境

  1. 安装golang
  2. 配置golang的编辑器或者ide
    1. vscode(编辑器) + 插件
    2. goland(ide)
  3. 也可以使用云开发环境:gitpod]

2.2基础语法

Hello World

  1. 通过鼠标悬浮,可以跳到对应的库的在线文档,然后找一些函数或者了解这个库image.png

变量

  1. 字符串是内置类型,可以直接通过字符串进行拼接
  2. 运算符的优先级都跟c差不多
  3. 常量没有确定的类型,根据上下文自动确定类型,关键字const
  4. 定义变量的方法
    1. var
    2. 直接:=赋值

if else

循环

  1. 只用一种:for循环

switch

  1. 不需要加break
  2. 可以取代if else

image.png

数组

  1. 少用,一般用切片

切片

  1. 创建切片的方法:
    1. 用make进行创建
  2. append
    1. 注意:append之后要重新赋值给原来的切片

map

  1. 创建:make
  2. 无序的

range

  1. 快速遍历 | | 第一个值 | 第二个值 | | --- | --- | --- | | 数组 | 索引 | 数组的值 | | map | key | value |

函数

指针

  1. 操作有限
  2. 主要用途:对常用的参数进行修改

结构体

结构体方法

  • 为结构体定义方法

错误处理

  • error可以通过erros.New(" ")进行创建

字符串操作

  • strings包

字符串格式化

image.png

  • 可以用%v来带引任意类型的变量
  • %+v获得更加详细的结果
  • %#v更加详细

JSON处理

image.png

  • 只要结构体里面的变量第一个字母是大写的,那么就可以用json.Marshal去序列化
  • 如果想改变序列化之后输出的格式,那么可以在结构体的对应变量的后面加上一个tag,后面写上你想要这个字段输出什么样子

序列化之后的结果要用string()才能打印出字符串里面的内容

  • 反序列化:json.Unmarshal(),里面用一个结构体变量去接收

时间处理

  • time包
  • time.Now().Unix()来获取时间戳
    • 什么叫时间戳?就是用单位为s来表示时间

数字解析

  • strconv包
  • strconv.ParseInt():将字符串转成int类型
    • 第二个参数,代表转化成多少进制
      • 0:代表自动去推测
    • 第三个参数:代表精度
  • strconv.Atoi(""):快速将字符串转成十进制数字
  • 如果输入不合法,那么就会返回错误

进程信息

  • os包
  • os.Args:获取进程在执行过程中的一些命令行参数
  • os.Getenv():获取环境变量
  • os.Setenv():设置环境变量
  • exec.Command():快速启动子进程并且获取其输入输出

3.实战

3.1猜字谜游戏

  1. 如果没有设置种子,那么输出的结果永远都是一样的
    1. 一般怎么设置种子呢?一般用时间戳进行种子的设置

3.1.3读取用户输入

  1. 老师用了bufio.NewReader(os.Stdin)的方式读取,比较复杂,但是后面的课程回用到,所以就先学一下这种复杂的方式
  2. reader.ReadString('\n')读到\n就停止
  3. 将字符串类型转成int类型

3.1.4实现判断逻辑

3.1.5实现游戏循环

看老师讲这个项目的感悟,通过看文件版本的比对,看文件增加了些什么,减少了什么,版本前后有什么变化,发生了什么变化。感觉对这个概念更加清晰了

3.2在线词典的介绍

  • 命令行版本的词典
  • 原理:调用第三方的API去查询单词的翻译并打印出来
  • 学习:
    • 如何用go语言发送http请求
    • 如何使用代码生成,提高开发效率

抓包

  • 彩云翻译为例
  • 打开网页后,右键,点击检查按钮
  • 随便写个英文单词,然他进行翻译
  • 在network中,从下往上,点击dict按钮,分别查看payload和Preview

代码生成

  1. 先复制curl请求
  2. 代码生成网站:curl相关的:curlconverter.com/#go
  3. 用到json序列化

解析response body

将json格式的代码转成go的格式,自动生成代码网站:oktools.net/json2go

打印结果

  • 需要的字段是音标和解释

3.3 SOCKS5代理介绍

  • SOCKS5相当于在防火墙内部开了一个口
  • 代理ip池,里面很多的都是SOCKS5协议

工作原理

TCP echo server

  • 发送什么就回复什么
  • nc的安装教程

auth:认证阶段

请求阶段

relay阶段

  • go routine
  • 标准库中的context机制
  • context.WithCancel(context.Background())创建ctx
  • ctx.Done()的执行时机是cancel()被调用的时机
  • 还可以用插件来进行测试:SwitchyOmega插件
      1. 新建情景模式:输入代理协议、代理服务器、代理端口
      1. 点击应用选项
      1. 点击上面的小图标image.png

课程总结

  • go语言学习路线图
  • 课后作业image.png
  • SOCKS5有什么好的讲解学习资料
    • initialfoo
    1. 找到第三方的讲解、任意语言的实现,搜索:"go SOCKS5协议"就行了