Go语言基础(1 2) | 豆包MarsCode AI刷题

61 阅读7分钟

Go语言基础(1 2) | 豆包MarsCode AI刷题

课程目录

  • Go语言上手-基础语言
  • Go语言上手-工程实践
  • 高质量编程与性能调优实战
  • 高性能Go语言发行版优化与落地实践

Go语言快速上手-基础语言

  • 简介

  • 入门

    • 开发环境
    • 基础语法
    • 标准库
  • 实战

    • 猜谜游戏
    • 命令行命词典
    • SOCKS5代理

简介

1.1 什么是Go语言
  1. 高性能高并发

    • 与C++,JAVA并列
    • 标准库即可开发高并发应用
  2. 语法简单,学习曲线平缓

    • 风格类似C,进行简化,上手容易
  3. 丰富的标准库

    • 大部分时候不需要第三方库
    • 稳定
  4. 完善的工具链

    • 丰富的社区环境
  5. 静态链接

    • 所有的编译结果默认静态链接
    • 部署方便快捷,只需要那个可执行文件
    • 镜像体积小
  6. 快速编译

    • 静态语言几乎最快
    • 本地开发1s左右
  7. 跨平台

    • windows,linux,树莓派,路由器,安卓
  8. 垃圾回收

    • 无需考虑内存分配释放
1.2 哪些公司在使用Go语言

反正一堆大厂,字节腾讯美团滴滴百度谷歌脸书七牛云b站PingCAP

1.3 字节跳动为什么全面拥抱Go语言
  1. 最早用py,性能原因改为Go
  2. c++不适合在线Web业务
  3. 早期团队不是java背景
  4. 性能好
  5. 部署简单,学习成本低
  6. 内部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

一个流程:

  1. 创建请求
  2. 设置请求头
  3. 发起请求
  4. 读取相应

实际上请求头有很大一部分是并不需要的

生成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

  1. 协商阶段(握手阶段)

    • client向socks5发送请求报文
    • 包括协议版本号(v5),支持的认证的种类(用密码鉴权,或者不需要认证)
    • sockss返回支持的认证
  2. 认证阶段

    • 如果协商阶段设置不需要,可以跳过这步
  3. 请求阶段

    • 协议版本号,请求的类型巴拉巴拉
    • 目标url,建立tcp连接
    • 代理服务器收到响应返回报文告诉client
  4. 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协议用对应的端口去建立连接

需要去建立浏览器与数据库的双向数据转化

可以去浏览器检查,可能需要安装某些插件