三个小项目入门Go语言|字节青训营笔记
前言
这是青训营的第一课,今天的课程比较快速的讲解了go语言的入门,并配合三个小的项目实践梳理所学知识点,这里详细回顾一下这三个项目,结合课后作业要求做一些代码补充,并附上自己的分析,青训期间的所有课程笔记会同步文末公众号,有需要同学请关注~。
项目仓库地址:https://github.com/wangkechun/go-by-example
实战
项目一:guessing-game
生成一个100以内随机数,玩家在控制台输入猜测的数字,程序会不断反馈猜测的值与生产值的大小关系,直到玩家输入正确,代码简单,这里直接贴出(需要注意不要忘记添加随机数种子):
项目二:simpledict
先概述一下功能:用户将需要翻译的单词作为参数在命令行运行go的main函数,程序会返回翻译结果。通过下面的语句可以直接运行样例仓库代码中的main函数,得到翻译结果。
那么程序是如何实现这个翻译功能的呢?它做了下面几件事:
获取main函数运行时的参数hello作为需要翻译的单词(通过go的api获取)
请求翻译软件的api获取结果数据:
这个过程和爬虫的工作比较像,模拟用户在网页上提交翻译的请求,其本质上就是发送了一个http请求,携带需要翻译的单词信息,响应翻译结果的json并由浏览器解析,通过下图的copy as cURL
可以将本次request的请求以cURL请求的方式拷贝。
访问:https://curlconverter.com/#go,这个在线工具可以将curl命令转换成go语言代码(或者其他语言),将得到的代码直接复制到goland中运行就可以实现用go代码模拟请求这个翻译接口,得到响应数据(文本格式的json)
解析结果数据
此时得到的翻译数据是文本格式的json(就是byte数组,或者说字符串),因此需要将其反序列化为go的结构体,然后打印出我们需要的翻译信息。
访问:https://oktools.net/json2go,这个在线工具可以将json转go的struct,然后将这个结构放入go代码中,使用json包的Unmarshal函数将json字符串字符串反序列化为结构体,后面就可以打印结构体中需要的属性(包含翻译结果)
- 改进:用到两个翻译软件的接口,并且并发访问,思路是一样的,就是再找一个翻译软件的接口重复上面的操作,然后重点在于并发的实现,这里启用两个goroutine,借助sync包的WaitGroup,先初始化一个2的容量,然后在一个go程结束之后调用wg.Done(),只有全部容量次数的Done调用后wg.Wait()才会放行,否则任意一个go程未完成,主go程都不会继续执行(但是如果没有这个WaitGroup去限制,则在主go程结束时,因为由其创建的子go程可能并没有完成,但依旧会结束,而恰恰因为并发的关系,编码先后顺序的失去了作用,发生这种情况的概率很高)
项目三:proxy
实现一个简易版的socks5的代理服务器,代理的工作流程如下:
本质就是客户端要先和代理服务器建立TCP连接,然后socks代理服务器和需要访问的目标服务器建立TCP连接,对于所有从客户端发来的请求由代理服务器转发给目标服务器,且目标服务器的响应数据也由代理服务器转发给客户端(socks5代理服务器就是以sock5s协议为标准去建立客户端和代理服务器的通信)
观察proxy项目包的v4版本(clone地址已经给出),看到代理服务端的process函数如下:
- 因为auth和connect函数中多次使用到的从缓冲区读取字节的这个api在缓冲区没有byte的时候,是会被阻塞的,因此会等待客户端发送数据,因此只要代理服务器遵守socks5协议规定的通信规则进行解析客户端的数据,发送指定的响应,而客户端也遵守这个规则解析和发送数据(本例就是curl --socks5 xxx帮我们完成了),就可以实现socks5代理服务器的工作模式
- 因此我理解中的socks5代理服务器就是完全在socks5协议约束的基础上进行编码的一个服务器,之后的请求和响应转发则和socks5没关系了
结束语
对于第三个样例这里只是着重讲了一下我的一些理解,socks5代理部分还有很多值得深入学习的地方。关于后面课程的学习,也尽量会保证笔记的输出,欢迎各位一起探讨学习~
关注微信公众号【程序员白泽】,将同步更新字节青训营的学习笔记
- 学习笔记(04):python flask web开发入门与项目实战-flask简介及web基础知识
- 学习笔记(10):SwiftUI入门到实战课程-使用Image图像视图显示项目中的图片
- (ASP.NET MVC4 入门学习笔记)学习自己建项目1----建项目、配路由、配数据库
- 学习笔记(02):python flask web开发入门与项目实战-python标识符
- 最新某某《 React基础入门与企业级项目实例开发教程 附带笔记 [》
- 【超然联盟后台】—— Ant Design Pro入门学习&项目实践笔记(二)
- 学习笔记(01):python flask web开发入门与项目实战-搭建开发环境[请安装专业版pycharm]...
- Go语言-----入门笔记
- 持续集成学习笔记-入门篇(8)成果管理自动化(二):maven项目站点管理
- Linux入门实践笔记(四)——Win下安装配置Git以及GitHub项目托管
- 【超然联盟后台】—— Ant Design Pro入门学习&项目实践笔记(一)
- shiro入门实战笔记(8)--Web项目Url配置
- (ASP.NET MVC4 入门学习笔记)学习自己建项目2----引入css和JS的配置、DBHelper及其他
- Maven学习笔记七:Maven使用入门(使用archetype生成项目骨架)
- 网课笔记 -- 安卓入门 -- 数据存储 --- 小项目-- 登录&&注册
- Java学习笔记-全栈-web开发-19-SpringBoot入门项目创建与整合
- Android Studio 学习笔记-新手入门-(2)导入项目遇到的问题
- Spring MVC+MyBatis开发从入门到项目实践 笔记(1)
- python学习笔记之Django入门二:创建项目、数据库及应用程序
- 学习笔记(12):python flask web开发入门与项目实战-函数的可变参数