Go基础应用 | 青训营笔记

500 阅读8分钟

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

[ Go基础应用 | 青训营笔记 ]


零、前言:

​ 本文记录和整理了本人在跟随字节青训营学习的一些我个人感觉比较重要的内容和知识,也有一部分内容是我认为自己比较难理解或记忆的,也一并记录于此文。

​ 撰写本文的目的不仅是为了赚取青豆,更重要的是方便我自己的复习和查阅,倘若各位读者有与我相似的问题,也可以参考之,如果对各位有帮助那就是我莫大的荣幸,也期望各位不吝赐教,多多指出我的问题,可以在下方留言或者私信我。

2023.02.05更新:对于一些评论区指出的错误进行了修改


一、本堂课重点内容:

  • 什么是Go语言?
    1. 高性能、高并发
    2. 语法简单、学习曲线平缓
    3. 丰富的标准库
    4. 完善的工具链
    5. 静态链接
    6. 快速编译
    7. 跨平台
    8. 垃圾回收
  • 还有吗?
    • 它没有隐式的数值转换,没有构造函数和析构函数,没有运算符重载,没有默认参数,也没有继承(但结构体有类型继承的机制),没有泛型(1.18开始支持,并使用[]),没有宏,没有函数修饰,更没有线程局部存储。但是,语言本身是成熟和稳定的,而且承诺保证向后兼容:用之前的Go语言编写程序可以用新版本的Go语言编译器和标准库直接构建而不需要修改代码。
    • Go语言有足够的类型系统以避免动态语言中那些粗心的类型错误,但是,Go语言的类型系统相比传统的强类型语言又要简洁很多。
  • 说了这么多,这节课都讲了什么呀?
    • 主要介绍了Go语言的简介
    • 开发环境与基础语法
    • 方便快捷的标准库
    • 三个小实战,帮助熟悉语法和了解Go语言的功能与应用

二、详细知识点介绍:

开发环境的配置:

我个人采用的是VSCode进行开发,大致的环境配置流程如下:

  1. 下载Golang安装包,解压后配置环境变量(我用的是.zip的安装包,手动配置环境变量)
  2. 在VSCode中安装两个插件:gorun
  3. 在项目路径下打开terminal,对于1.11以后的版本直接在terminal里go mod init <filename>
  4. 生成go.mod文件后,就可以新建一个main.go来进行coding了
  5. 特别地,如果报go.mod的错误,建议使用code .的方式打开项目文件夹

一些细节可以参考我自己的博客,一段时间之前写的了,如果有任何错误还请指出。

学习记录丨GoLang基础 | 落雨乄天珀夜 (gitee.io)

基础语法与标准库:

整体与C/C++类似,一些不同的地方需要特别注意,由于基础语法部分篇幅和细节比较多,这里就不做介绍了,我在上面给出的博客链接中有详细一些的介绍。

除此之外,需要特别关注几个重要的内容:

  • slice、map和range
  • 错误处理与大并发
  • 数字解析
  • 进程信息

特别地,在课程中提到了对于JSON的处理,在后续的实际例子中用到了,即对于一个结构体,只要保证每个字段的第一个字母是大写(公开字段),就可以用json.Marshal来序列化,随后用string强转成字符串输出即可查看。

对于标准库部分,可以参考:pkg.go.dev/std


三、实践练习例子:

猜谜游戏

在学习这个例子的时候我复习了Go语言的很多基础语法。

不仅如此,在完成这个例子的课后习题时,也就是第一道题,我一开始使用fmt.Scanf()进行代码简化,遇到了一些问题,循环总是会多次进行,并且第二次的guess值一直是0。我思考了一下,并且查阅了一些资料,发现原来是fmt.Scanf()会把输入数字之后的空格也放入缓存区里,所以缓存区会有两个东西,循环也就进行了两次。解决方法就是在format里面手动加一个\n来吃掉这个空格就可以了。

本来想用fmt.Scan()来代替,但转念一想可能这个作业题目就是为了让我们知道fmt.Scanf()的这个特性,于是就着手去解决了。

在线词典

在学习这个例子的时候了解到了如何手动抓包的基本知识。

当然,现在有很多可以自动抓包的工具,本人会在后续的学习过程中逐渐了解和使用。

在完成这个实践任务的相关课后习题的时候,我遇到了一些问题,在例子中给出了适合于彩云翻译的结构体以及JSON解析,但是对于其他的翻译网站没有给出,我尝试照猫画虎,但是失败了,我觉得可能是需要查找更多的资料,或者自己手写一个适合于其他翻译网站的内容。

同时,也接触到了两个很好用的网站:

curlconverter.com/go/

oktools.net/json2go

在实践的过程中,我了解到bash和cmd的curl是不一样的,我用bash的curl成功生成了代码。

在通过json生成结构体的时候,我了解到如果不需要对这个返回结果做很多精细的操作,可选择转换嵌套来让生成的代码更加紧凑。

SOCKS5代理

前提:socks5协议都是明文传输

用途:

某些企业的内网为了确保安全性,有很严格的防火墙策略,副作用就是访问某些资源很麻烦,

socks5相当于在防火墙上开了个口子,让授权的用户可以通过单个端口去访问内部的所有资源。

在爬虫的时候,爬取过程中很容易会遇到IP访问频率超过限制,这个时候很多人就会去上网找一些代理IP池,这些代理IP池里的很多代理协议就是socks5。

启动后的效果:

  1. 启动,然后在浏览器里面配置使用这个代理,打开网页;
  2. 代理服务器的日志,会打印出你访问的网站的域名 or IP,这说明我们的网络流量是通过这个代理服务器的;
  3. 我们也能在命令行去测试我们的代理服务器,curl -socks5 <代理服务器地址>,后面加一个可访问的URL,如果工作正常,则curl命令就会正常返回。

原理:

avatar

正常浏览器访问一个网站,如果不经过代理服务器的:

  1. 先和对方的网站建立TCP连接
  2. 然后三次握手
  3. 然后发起HTTP请求
  4. 然后服务返回HTTP响应。

如果设置代理服务器,流程变复杂,变为:

  1. 首先浏览器和socks5代理建立TCP连接,代理再和真正的服务器建立TCP连接,分为四个阶段
  2. 握手阶段:浏览器会向socks5代理发送请求,内容包括一个协议的版本号,还有支持的认证的种类,socks5服务器会选中一个认证方式,返回给浏览器。如果返回的是00的话就代表不需要认证,返回其他类型的话会开始认证流程。
  3. 认证阶段:有点复杂暂略。
  4. 请求阶段:认证通过后浏览器会向socks5服务器发起请求,主要信息还是包括版本号和请求的类型,一般主要是connection请求,就代表代理服务器和要某个域名或者某个IP地址某个端口建立TCP连接。代理服务器收到响应后,会真正和后端服务器建立连接,然后返回一个响应。
  5. relay阶段:此时浏览器会发送正常请求,然后代理服务器收到请求后,会直接把请求转换到真正的服务器上。然后如果真正的服务器以后返回响应的话,那么也会把请求转发到浏览器这边。然后实际上代理服务器并不关心流量的细节,可以是HTTP流量,也可以是其他TCP流量。这个就是socks5协议的工作原理。

四、课后个人总结:

  • 本章有什么知识点不容易掌握?

    • socks5的原理比较难掌握,后续还需要进一步的学习和复习才行。
  • 什么地方容易与其他内容混淆?

    • 设置代理服务器后的四个阶段之间的名词比较相近,如果没有原理图帮助记忆很容易混淆。

    • 包括fmt.Scanf() fmt.Scan() fmt.Scanln()之间的区别。


五、引用参考:

  • socks5的原理部分参考了掘金内部课的课件。
  • 引用了我自己的博客,作为补充和说明。

未完待续...(随时补充修改)

谢谢大家的阅读,欢迎互动,也欢迎访问我的博客!

conqueror712.github.io/