#8 Go: 任务看起来不少,可我真的很简单!

写在最前面:
  • 任务一:建议大一同学大二同学完成
  • 任务二:建议大二同学感兴趣的大一同学完成
  • 任务三:建议感兴趣的大二同学完成
  • 三个任务不设置下限门槛,有能力的同学,可以全部完成哦~
  • 标注有(需要你的Code)的任务为必须动手写代码完成的部分
  • 整个任务的完成情况记录在你的Markdown中,要求实现程序的部分,建议同时使用截图展示执行结果(不要把截图弄成本地路径了哦!)
  • 哪怕没有完成任务也没有关系,一定要把你尝试和努力的过程写在你的Markdown内并提交哦!评分并不只关注结果~

背景一

有一天,人见人爱的高金鱼得到了一个巨大的文本文件。

她听说,只要能把这个文件全部读取出来,就能找到焦糖布丁的美味秘诀!这让身为吃货的她感到非常的激动。

可是这个文件实在是太太太太大了,高金鱼用记事本打开它,密密麻麻的文字让她和她的电脑都产生了怯意,为此她一筹莫展。

你看见她对着自己的头发一通乱抓,询问马特应该怎么办,愚蠢的马特也对着自己的头发一通乱抓,

然后转向了正在读这段话的你:

你能帮帮我吗?

任务一:Go是甚摸东西?

Go是人见人爱的fps游戏CSGO一门新兴的轻量语言,号称有非常强大的并发能力和极高的性能

有一位计算机界的牛牛如此评价Go:image-20210831234152392

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

马特:哇,你说的这个Go语言它太厉害了,那你能帮帮我吗?

为了帮助马特,从而获得焦糖布丁的美味秘诀,你的任务是:

  1. 了解Go/Golang是什么

  2. 学习如何使用Go语言编写程序

    这里给出一个菜鸟教程的参考资料:菜鸟教程-Go

    除此之外,网络上还有很多更优秀的Go语言教程,好好利用好常用的搜索引擎哦!

  3. 了解Go语言文件读取的过程

  4. 使用Go实现一个简单的读取文本文件的程序,救救马特!(需要你的Code)

    具体要求:

    1. 逐行读取给出的示例文件
    2. 将读取的文件每1000行存入一个新文件里(比如sample_01.outsample_02.out…)

示例文件:点我开始下载哦 (该文件为随机生成的文件,其中包含行号(从0开始)和随机字符串,你可以利用这个特性来检查你的代码是否正确哦)

Tips: 建议使用Goland来编写代码,因为VScode的配置会比较复杂。 Goland的下载链接:Goland-Download

你可以将你的学习过程记录在Markdown中,详实认真,举一反三的学习笔记会成为很好的加分项哦~~

其他参考资料:

背景二

高金鱼拿着你的Go语言学习笔记和你写好的程序,多亏了Go语言直接编译成机器码的特性,不需要下载乱七八糟的库就能直接使用它

高金鱼开心的打开了程序,这个程序老老实实地开始读取文件的每一行信息,

她看到一行行的信息正在被读取,非常开心的坐下开始等待读取的完成。

······

高金鱼醒来的时候以为自己在飞机跑道上,程序还在勤勤恳恳老老实实的运行,噢,原来是风扇转的飞快

不知道过去了多少个小时,这个文件仍然没有被读取完,高金鱼感到束手无策,给了不争气的马特一拳,马特擦了擦泪水,

然后再次转向了正在读这一段话的你:

你能帮帮我吗?

任务二:一个人干活慢,那就大家一起来!

细心的马特发现,这个程序运行的过程中,内存的占用一直很小,是不是可以用很多的程序一起运行来加快速度捏?

马特虽然细心,但是还是没有摆脱愚蠢,这样运行显然是没有用的,很多程序一起从同一个起点出发是没有办法加快速度的~

但是不争气的愚蠢马特为我们提供了一个思路,既然一个人干活慢,那就大家一起来!

  1. 了解什么是并发&&如何使用Go语言的并发特性

    自行百度、Google喽~

  2. 思考,如何并发的读取文件并设计可能的方法

    Tips: 这一部分可以记录在你的Markdown中,即使没有想出很多方法也没有关系,一定要把探索的历程尽量记录下来哦~

  3. 使用Go语言实现一个并发读取文件的程序,救救马特!(需要你的Code)

    具体要求:

    1. 可以不使用逐行读取

    2. 自行划分每个并发单位要读取的文本大小(不以行为单位,使用字符数作为单位)

      Tips: 如果你坚持使用行为单位,实现成功也会是加分项~

    3. 自行设置需要的并发数

      Tips: 并发数不是越高越好哦~

    4. 将这些文本按照任务一要求的形式存储到对应的文件中

你可以将你的学习过程记录在Markdown中,详实认真,举一反三的学习笔记会成为很好的加分项哦~~

背景三

人见人爱的高金鱼在你的帮助下终于得到了焦糖布丁的美味秘诀,她向你表示了感谢并且赠送给你了一打焦糖布丁。

后来,高金鱼又获得了许多的超级大大大大大的文本,它们都包含着更复杂的美食的美味秘诀,高金鱼想要把它们都得到,于是使用你的程序一个一个获得它们

可是在这个时候,你的程序占据了巨大的内存,运行非常迟缓,高金鱼不得不每次都逮住愚蠢的马特,每次运行都调整一次并发的数目和每个并发单位要读取的文本大小,这实在是太麻烦了!

懒惰的马特非常郁闷,心想,要是可以程序自己去看情况自己修改参数就好了!

马特迟迟不能完成高金鱼完成的任务,害怕又要遭受一波毒打,眼泪汪汪的转向了你:

你能帮帮我吗?

任务三:自己心里有B数的代码动态调整的并发

  1. 了解什么是协程池

  2. 自己实现一个简单的协程池(需要你的Code)

    只需要实现限制协程数量的功能(Tips: 搜索WaitGroup)

  3. 了解使用Ants库(使用很简单功能很强大的库,非常滴好哦)

    Ants库介绍:Ants

  4. 实现依据内存占用修改并发数目和并发单位要读取的文本大小,救救马特!(二者有一个就够啦)

    1. 使用Ants库
      1. 思考:要使用阻塞式提交Or并发式提交?
      2. 自己实现(需要你的Code)
    2. 自己实现(选做,属于加分项)(需要你的Code)

提交要求

任务一

  1. 学习Golang的学习笔记(Markdown)
  2. 尝试编写代码的过程(Markdown)
  3. 读文件程序的代码及编译好的程序(Code&Program)

任务二

  1. 学习并发(Markdown)
  2. 尝试编写代码的过程(Markdown)
  3. 实现并发读取文件的代码及编译好的程序(Code&Program)

任务三

  1. 学习协程池、Ants库等的过程(Markdown)
  2. 尝试使用Ants库或自行实现协程池的过程(Markdown)
  3. 动态调节的并发程序的代码及编译好的程序(Code&Program)

参考资料

The Go Programming Language

A Tour To Go

菜鸟教程-Go语言基础