#8 Go: 任务看起来不少,可我真的很简单!
写在最前面:
- 任务一:建议大一同学和大二同学完成
- 任务二:建议大二同学或感兴趣的大一同学完成
- 任务三:建议感兴趣的大二同学完成
- 三个任务不设置下限门槛,有能力的同学,可以全部完成哦~
- 标注有
(需要你的Code)
的任务为必须动手写代码完成的部分 - 整个任务的完成情况记录在你的Markdown中,要求实现程序的部分,建议同时使用截图展示执行结果(不要把截图弄成本地路径了哦!)
- 哪怕没有完成任务也没有关系,一定要把你尝试和努力的过程写在你的Markdown内并提交哦!评分并不只关注结果~
背景一
有一天,人见人爱的高金鱼得到了一个巨大的文本文件。
她听说,只要能把这个文件全部读取出来,就能找到焦糖布丁的美味秘诀!这让身为吃货的她感到非常的激动。
可是这个文件实在是太太太太大了,高金鱼用记事本打开它,密密麻麻的文字让她和她的电脑都产生了怯意,为此她一筹莫展。
你看见她对着自己的头发一通乱抓,询问马特应该怎么办,愚蠢的马特也对着自己的头发一通乱抓,
然后转向了正在读这段话的你:
你能帮帮我吗?
任务一:Go是甚摸东西?
Go是人见人爱的fps游戏CSGO一门新兴的轻量语言,号称有非常强大的并发能力和极高的性能
有一位计算机界的牛牛如此评价Go:
Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。
马特:哇,你说的这个Go语言它太厉害了,那你能帮帮我吗?
为了帮助马特,从而获得焦糖布丁的美味秘诀,你的任务是:
-
了解Go/Golang是什么
-
学习如何使用Go语言编写程序
这里给出一个菜鸟教程的参考资料:菜鸟教程-Go
除此之外,网络上还有很多更优秀的Go语言教程,好好利用好常用的搜索引擎哦!
-
了解Go语言文件读取的过程
-
使用Go实现一个简单的读取文本文件的程序,救救马特!(需要你的Code)
具体要求:
- 逐行读取给出的示例文件
- 将读取的文件每
1000
行存入一个新文件里(比如sample_01.out
、sample_02.out
…)
示例文件:点我开始下载哦 (该文件为随机生成的文件,其中包含行号(从0开始)和随机字符串,你可以利用这个特性来检查你的代码是否正确哦)
Tips: 建议使用Goland来编写代码,因为VScode的配置会比较复杂。 Goland的下载链接:Goland-Download
你可以将你的学习过程记录在Markdown中,详实认真,举一反三的学习笔记会成为很好的加分项哦~~
其他参考资料:
背景二
高金鱼拿着你的Go语言学习笔记和你写好的程序,多亏了Go语言直接编译成机器码的特性,不需要下载乱七八糟的库就能直接使用它
高金鱼开心的打开了程序,这个程序老老实实地开始读取文件的每一行信息,
她看到一行行的信息正在被读取,非常开心的坐下开始等待读取的完成。
······
高金鱼醒来的时候以为自己在飞机跑道上,程序还在勤勤恳恳老老实实的运行,噢,原来是风扇转的飞快
不知道过去了多少个小时,这个文件仍然没有被读取完,高金鱼感到束手无策,给了不争气的马特一拳,马特擦了擦泪水,
然后再次转向了正在读这一段话的你:
你能帮帮我吗?
任务二:一个人干活慢,那就大家一起来!
细心的马特发现,这个程序运行的过程中,内存的占用一直很小,是不是可以用很多的程序一起运行来加快速度捏?
马特虽然细心,但是还是没有摆脱愚蠢,这样运行显然是没有用的,很多程序一起从同一个起点出发是没有办法加快速度的~
但是不争气的愚蠢马特为我们提供了一个思路,既然一个人干活慢,那就大家一起来!
-
了解什么是并发&&如何使用Go语言的并发特性
自行百度、Google喽~
-
思考,如何并发的读取文件并设计可能的方法
Tips: 这一部分可以记录在你的Markdown中,即使没有想出很多方法也没有关系,一定要把探索的历程尽量记录下来哦~
-
使用Go语言实现一个并发读取文件的程序,救救马特!(需要你的Code)
具体要求:
-
可以不使用逐行读取
-
自行划分每个并发单位要读取的文本大小(不以行为单位,使用字符数作为单位)
Tips: 如果你坚持使用行为单位,实现成功也会是加分项~
-
自行设置需要的并发数
Tips: 并发数不是越高越好哦~
-
将这些文本按照任务一要求的形式存储到对应的文件中
-
你可以将你的学习过程记录在Markdown中,详实认真,举一反三的学习笔记会成为很好的加分项哦~~
背景三
人见人爱的高金鱼在你的帮助下终于得到了焦糖布丁的美味秘诀,她向你表示了感谢并且赠送给你了一打焦糖布丁。
后来,高金鱼又获得了许多的超级大大大大大的文本,它们都包含着更复杂的美食的美味秘诀,高金鱼想要把它们都得到,于是使用你的程序一个一个获得它们
可是在这个时候,你的程序占据了巨大的内存,运行非常迟缓,高金鱼不得不每次都逮住愚蠢的马特,每次运行都调整一次并发的数目和每个并发单位要读取的文本大小,这实在是太麻烦了!
懒惰的马特非常郁闷,心想,要是可以程序自己去看情况自己修改参数就好了!
马特迟迟不能完成高金鱼完成的任务,害怕又要遭受一波毒打,眼泪汪汪的转向了你:
你能帮帮我吗?
任务三:自己心里有B数的代码动态调整的并发
-
了解什么是协程池
-
自己实现一个简单的协程池(需要你的Code)
只需要实现限制协程数量的功能(Tips: 搜索
WaitGroup
) -
了解使用Ants库(使用很简单功能很强大的库,非常滴好哦)
Ants库介绍:Ants
-
实现依据内存占用修改并发数目和并发单位要读取的文本大小,救救马特!(二者有一个就够啦)
- 使用Ants库
- 思考:要使用阻塞式提交Or并发式提交?
- 自己实现(需要你的Code)
- 自己实现(选做,属于加分项)(需要你的Code)
- 使用Ants库
提交要求
任务一
- 学习Golang的学习笔记(Markdown)
- 尝试编写代码的过程(Markdown)
- 读文件程序的代码及编译好的程序(Code&Program)
任务二
- 学习并发(Markdown)
- 尝试编写代码的过程(Markdown)
- 实现并发读取文件的代码及编译好的程序(Code&Program)
任务三
- 学习协程池、Ants库等的过程(Markdown)
- 尝试使用Ants库或自行实现协程池的过程(Markdown)
- 动态调节的并发程序的代码及编译好的程序(Code&Program)