Go语言基础(1 2) | 豆包MarsCode AI刷题
课程目录
- Go语言上手-基础语言
- Go语言上手-工程实践
- 高质量编程与性能调优实战
- 高性能Go语言发行版优化与落地实践
Go语言快速上手-基础语言
-
简介
-
入门
- 开发环境
- 基础语法
- 标准库
-
实战
- 猜谜游戏
- 命令行命词典
- SOCKS5代理
简介
1.1 什么是Go语言
-
高性能高并发
- 与C++,JAVA并列
- 标准库即可开发高并发应用
-
语法简单,学习曲线平缓
- 风格类似C,进行简化,上手容易
-
丰富的标准库
- 大部分时候不需要第三方库
- 稳定
-
完善的工具链
- 丰富的社区环境
-
静态链接
- 所有的编译结果默认静态链接
- 部署方便快捷,只需要那个可执行文件
- 镜像体积小
-
快速编译
- 静态语言几乎最快
- 本地开发1s左右
-
跨平台
- windows,linux,树莓派,路由器,安卓
-
垃圾回收
- 无需考虑内存分配释放
1.2 哪些公司在使用Go语言
反正一堆大厂,字节腾讯美团滴滴百度谷歌脸书七牛云b站PingCAP
1.3 字节跳动为什么全面拥抱Go语言
- 最早用py,性能原因改为Go
- c++不适合在线Web业务
- 早期团队不是java背景
- 性能好
- 部署简单,学习成本低
- 内部RPC和HTTP框架推广
入门
2.1 开发环境安装
官网下载
配置集成开发环境,vscode或者goland
基于云的开发环境
2.2 基础语法
go是一门强类型语言
字符串,整数,浮点,布尔
字符串是内置类型,可以直接用加号连接
大部分与C和C++类似
变量申明两种方式
var 变量名 = value,自动推导类型,也可以显式写出来,var b, c int = 1, 2变量名 := value
常量声明只需要把var改成const,常量根据上下文自动确定类型
写法与C,C++类似,if后的条件判断没有括号
if条件后必须跟大括号,不能如同C,后续内容写在同一行
C中的switch,如果没有break,会默认跑完所有分支,golang不需要
golang可以用switch放任意变量类型,甚至取代if else
常规业务代码中很少使用长度固定的数组,更多使用切片
允许用冒号切片取出其中元素
实际使用最频繁
在后面加一个OK确认这个键值存不存在
快速遍历更加简洁
go中的函数返回结果后置,常常返回两个值
指针类型相似,取地址符与星号使用
结构体是大字段类型集合
可以作为参数,可以直接写入
结构体方法,可以为结构体定义一些方法,封装函数,这样去调用这些代码
错误处理可以帮助很轻松得排查bug,这里还体现在函数的返回错误等
err存在可能就需要作出一些debug,比如打印错误类型
字符串操作一大串,总之就是看
字符串格式化,和上面那个一样,都是标准包封装好的方法
json操作,对弈一个结构体,只要保证每个首字母是大写,就可以用json直接转化
可以在结构体定义里面加东西方便转化
时间处理,date,time等等,时间戳时间段,字符串解析成时间等等
数字解析,都在strconv包下,有各种方法
进程信息,可以直接用os包内的东西获取进程信息,获取或者写入环境变量
实战
3.1 猜谜游戏
第一步,生成一个0到100的随机数
maxNum := 100
secretNumber := rand.Intn(maxNum)
但是在使用rand前要使用随机数种子,不然随机出来的可能一直都是同一个数字
rand.Seed(time.Now().UnixNano())
接下来要读取用户输入,读入用户的答案后做一个判断,然后返回结果,记得不要落下错误信息
这里用scanf有更简洁的写法(作业)
接下来要实现游戏循环
return的地方改为continue,胜利的时候使用break退出循环
于是我们实现了一个猜谜游戏
3.2 在线词典
通过第三方api实现,在命令行末尾跟一个单词,可以得到单词的翻译,音标还有注释
如何用go,来发送http请求,解析json,还有代码生成提高效率
抓包
先去在线浏览器扒拉代码,可以找到翻译请求的url,方法和返回的json等
右键浏览器的请求,找到copy as cURL
可以直接找个终端输入,应该返回一个json
生成代码解读
然后去对应的在线网站,把得到的json输入进去,可以得到在线go代码,稍加修改就能使用
https://curlconverter.com/#go
一个流程:
- 创建请求
- 设置请求头
- 发起请求
- 读取相应
实际上请求头有很大一部分是并不需要的
生成request body
此时已经可以输出一大串的json,但是这时候非常的难以解读,最好是可以在代码中将json序列化,然后直接输出对应的的我们需要的参数
解析response body
要从其中得到需要的字段。一般来说json解析之后得到的是一个dict或者map,但go是一门强类型语言,实际上最好还是想之前说的,设定一个结构体
这里的东西可以靠代码生成实现
https://oktools.net/json2go
通过代码生成得到一个巨大的struct,接下来修改代码,可以用json.Unmarshal等方式反序列化得到需要的东西
打印结果
用range循环打印。也可以补充一些防御式编程,报错啊错误参数呀
3.3 SOCKS5代理
协议都是明文传输,socks5不能用作代理服务器
socks5来自互联网早期,复杂的策略让你即使是管理员也很难轻松访问到各种资源
socks5相当于在防火墙内开了个口子,通过单个端口访问内部所有资源
tcp echo server
https://hi-hi.cn/go
-
协商阶段(握手阶段)
- client向socks5发送请求报文
- 包括协议版本号(v5),支持的认证的种类(用密码鉴权,或者不需要认证)
- sockss返回支持的认证
-
认证阶段
- 如果协商阶段设置不需要,可以跳过这步
-
请求阶段
- 协议版本号,请求的类型巴拉巴拉
- 目标url,建立tcp连接
- 代理服务器收到响应返回报文告诉client
-
relay阶段
- 简单把请求转发,把响应转发,不关心流量细节
一 简单tcp echo:向他发送什么,他就返回什么
直接用nc命令对1080端口进行一个tcp连接。nc命令需要下载netcat
nc 127.0.0.1 1080
二 实现协议的第一步,认证阶段
先实现一个空的auth函数,参数是一个只读流和一个tcp连接
先写报错
首先构造一个回送的报文,我们要先把报文完整地读出来
前两个都是一字节,一个一个读入,出错就报错并关闭连接
在这一步确认协议
三 请求阶段,试图读取浏览器的报文,打印出来
请求阶段的逻辑,包括六个字段,版本,命令,保留字段,目标地址类型,目标地址,端口号
反正一个一个读入呗
这里创建四个字节的缓冲区,一口气读入前四个字段,然后一个一个验证其合法性
这一步尝试curl -socks5 127.0.0.1:1080 -v http://www.qq.com
仍然会失败,但可以看到正常打印出url与端口,说明到这一块都是正确的
四 建立tcp连接
用tcp协议用对应的端口去建立连接
需要去建立浏览器与数据库的双向数据转化
可以去浏览器检查,可能需要安装某些插件