范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一次编写,随处存储Go的可扩展文件系统

  照片由Caroline Selfors在Unsplash上拍摄
  我正在为飞机旅行收拾行李箱,我刚刚意识到我没有足够的空间来放我所有的衣服。我的手提箱以前工作得很好——显然我的需求发生了变化。
  我可以把所有东西都塞进去,然后用绳子把它系起来。或者我可以把多余的衣服塞进三个购物袋,然后把四个都带过机场?这看起来不太好。拼凑或彻底改变我存放衣服的方式是一种糟糕的旅行计划方式——我需要更好的东西。更简单的东西。当然,我真正需要的只是一个更大的手提箱。手提箱是可以互换的,只需将衣服从一个换到另一个。
  我的困境现在有点愚蠢和明显,但事实证明可交换存储也非常适合软件存储。便携式软件的梦想是"一次编写,随处运行"。软件也应该有可移植性数据。无论您是将数据存储在 S3 存储桶、磁盘还是 Web 浏览器中,它们都应该可以轻松互换。
  便携式软件的梦想是"一次编写,随处运行"。软件也应该有可移植的数据。
  不幸的是,它通常不是那么简单:每个新的数据"手提箱"不能以相同的方式放置,使用非常规的包装,或者如果你看起来很有趣,它就会分崩离析。如果没有共同的标准或审查过程,就很难为您的程序确定一个存储系统。不需要更改您的程序以符合独特的存储系统,并且适应未来的变化应该不难。我们需要用于不同类型存储的通用接口和一个共享测试套件来审查它们。标准存储箱
  通用存储标准可以帮助解决这些问题,但它们需要在社区中广泛采用才能发挥作用。采用标准的第一步是在熟悉的设计和熟悉的来源中引入它。例如, Go在标准库中引入了文件系统接口,为开发人员的构建奠定了基础。它使用不起眼的文件,一个熟悉的数据包,组织在文件夹中,形成一个文件系统。Go 的"分层"文件系统模式是一个不错的选择,因为它已经在其他领域广泛使用。从智能手机上的相册到网络浏览器中的书签,文件系统模式在当今软件中无处不在。文件系统似乎是通用存储接口的绝佳选择。
  在Hackpad的开发过程中,我们的存储系统开始出现裂痕,但我们缺乏修复它的工具。我们的大多数组件都需要使用几种不同的存储系统来读取和写入数据。对于每个新的存储系统,我们每次都编写和重写适配器代码——它造成了大量的流失。它从一个简单的内存存储开始,然后发展为流式.tar.gz文件阅读器,然后是覆盖文件系统。当我们也需要添加基于浏览器的存储时,很明显:需要一个新的、灵活的抽象。
  在本文中,我们将讨论 Go 程序的一种新的、可扩展的文件系统模式及其工作原理。Go 的文件系统接口io/fs.FS为新的可能性打开了大门。让我们用 HackpadFS 把这扇门打开。HackpadFS
  我们开源了我们的库HackpadFS,以定义通用文件系统接口并共享严格的测试套件,使每个人都可以制作自定义和可移植的文件系统。它将 Go 的入门文件系统提升到了一个全新的水平:50 多个小型、可组合的文件和 FS 接口多层覆盖文件系统内置文件系统:本机、内存、Web 浏览器、流媒体等用于合规性和一致性的严格测试套件
  接下来,让我们用 HackpadFS 的内置文件系统、通用接口和成熟的测试套件探索新的可能性。内置文件系统
  文件系统或 FS 是由"路径"定位的文件的集合。如果您之前使用过 Goos包,那么您已经使用过 FS。但是,重要的是要注意os包的静态函数不能用作实现通用接口的对象。它不能与其他实现交换,并且您的数据仅在一种存储中。Go 的io/fs.FS界面让我们一瞥可交换文件系统的可能性。使用 HackpadFS,我们可以在不重写代码的情况下尝试各种新的存储系统。
  将相同的数据放入新的存储中。照片由Aleksei Ieshkin在Unsplash上拍摄
  HackpadFS 附带了几个强大的文件系统。其中每一个都符合 HackpadFS 的新接口和io/fs.FS强大的冲击力:os.FS– 熟悉的os包裹。使用新的接口设计实现标准库中所有熟悉的行为。mem.FS– 内存中的 FS。indexeddb.FS– 与 WebAssembly 兼容的 FS,在后台使用 Web 浏览器的IndexedDB API。tar.ReaderFS- 流式 tar 归档文件 FS,用于内存和时间受限的程序。mount.FS– "覆盖"FS。能够在彼此之上安装文件系统。keyvalue.FS– 一个通用的键值对 FS。非常适合快速编写自己的 FS。mem.FS并indexeddb.FS建立在它之上。cache.ReadOnlyFS– 一个只读缓存,包装另一个 FS。
  将其中一些组合在一起可以创建真正创新的程序,而无需对单个存储系统进行硬编码。
  作为一个真实的例子,Hackpad现在使用其中的大部分在浏览器中构建 Go IDE。查看GitHub 上的源代码。
  寻找灵感来创建自己的 FS?这里有一些想法:从 S3 存储桶 FS 中的文件(例如s3.FS.通过 Dropbox、Google Drive 或 OneDrive FS 与其他设备共享。将文件更改提交到 Git,就像go-git/go-git.使用 SSH FS 编辑远程服务器上的文件。知名接口的威力
  Go 1.16 首次推出了新io/fs包,展示了用于实现只读文件系统的标准接口。它还演示了通过 HTTP 从任何兼容的文件系统通过net/http.FS. HackpadFS 项目受到这种方法的启发,为所有 Go 程序创建通用接口。早期的灵感也来自spf13/aferoand go-git/go-billy,尽管 HackpadFS 采用了不同的方法,为自定义文件系统提供模块化接口,并捆绑了严格的测试套件以实现严格的一致性。
  众所周知的界面可帮助开发人员制作创意组合,但他们所定义的只是不同系统的交互方式。HackpadFS 通过共享许多模仿 Go和包的小型且可组合的接口来授权开发人员。要实现自定义 FS,您只需要编写最少的代码。osio/fs
  例如,要创建一个foo.FS只添加的 new Lstat(),我们可以编写一个只有 2 个方法的完整 FS 结构:包 foo导入"github.com/hack-pad/hackpadfs"输入 FS 结构 {}func NewFS() (*FS, error) { return &FS{}, nil }func (fs *FS) Open(name string) (hackpadfs.File, error) {      // ...  }func (fs *FS) Lstat(name string) (hackpadfs.FileInfo, error) {      // ...  }// 类型 *FS 实现标准库的 FS 和 hackpadfs.LstatFS:  var _ interface {      hackpadfs.FS      hackpadfs.LstatFS  } = &FS{}
  处理接口类型可能很棘手,因此 HackpadFS 还包含帮助函数来简化代码。现在任何人都可以使用foo.FShelpershackpadfs.Lstat(fooFS, "bar")来避免对泛型进行类型检查hackpadfs.FS。如果事实证明 FS 不支持相应的接口或兼容的接口,则返回"未实现"错误。新标准接口
  那么,HackpadFS 包含哪些 Go 不包含的内容?这是所有新旧接口的快速细分,以及我们如何扩展它们。
  Go 的内置接口包括FS、File、FileInfo和DirEntry. 另一方面,HackpadFS 为兼容性定义了等效接口,然后再定义了27个:
  所有这些接口都可以使用您需要的任何功能来组成您自己的 FS。
  Go 还实现了几个帮助函数以使 FS 处理更简单。HackpadFS 实现了大多数相同的助手,然后还有23个:常见错误
  对我们来说,一个常见的麻烦来源是处理错误。理想情况下,我们可以使用errors.Is()orerrors.As()来检测某些类型的错误,但我们需要检查的值高度不一致。有时我们可以检查标准库错误,例如fs.ErrExist.,但有时我们被迫拉入syscall包以正确检测诸如"不是目录"之类的错误。
  HackpadFS 通过包含一组行为正确且一致的统一错误来解决此问题:共享测试套件
  最后但并非最不重要的一点是:如果文件系统不发挥作用,那么它就是不好的。为了确保严格的一致性,HackpadFS 提供了一个共享的测试套件,fstest来检查每个文件系统是否与包的行为相同os。
  它旨在易于针对自定义文件系统使用,并且只会对实现它们的文件系统运行特定接口的测试。例如,让我们测试一下foo.FS:包 foo进口(     "测试"    "github.com/hack-pad/hackpadfs/fstest"  )func TestFS(t *testing.T) {      t.Parallel()      options := fstest.FSOptions{          Name: "foo",          TestFS: func(tb testing.TB) fstest.SetupFS {              fs, err := NewFS()              if err != nil {                  tb.Fatal(err)              }              return fs          },      }      fstest.FS(t, options)      fstest.File(t, options)  }
  两者fstest.FS()及fstest.File()以上都启动了大量的子测试。每个子测试调用TestFS()创建新foo.FS实例,然后并行运行它们。由于foo.FS仅实现FSand LstatFS,因此只有那些测试会运行——所有其他测试都将被跳过。文件也是如此:如果返回的文件Open()仅支持读取操作,则仅运行文件读取测试。
  测试套件是严格的,以确保非常严格的合规性和与os包行为的一致性。没有什么比一个不像一个文件系统更糟糕的了。今天,在文件系统上fstest运行90次测试和在文件上运行50次测试,总共556个断言。它已集成到所有 6 个内置文件系统的 CI 测试中。试一试
  我们认为共享通用接口和严格的测试套件将有助于为 Go 社区创建一个强大的文件系统生态系统。HackpadFS 界面的可组合性及其内置文件系统可以在编写下一个应用程序时为每个人提供动力。去获取 github.com/hack-pad/hackpadfs
  我们希望您能尝试一下 HackpadFS!把它放在一起真的很有趣,我们很想知道你是否有反馈。

内卷的世界,旅行的奢望,变乱的巴别塔新冠疫情三年,洲际旅行成为不可能的奢望,人类国相隔市相离,全球化就好比巴别塔,被一个莫名强大的力量变乱阻止,无论是一再变异的病毒,还是莫名其妙的战乱。回首自由的时代,其实也仅仅数年各国签证及入境最新消息汇总丨4月3日更新随着疫情逐渐得到控制,多国宣布调整出入境政策,放宽限制成为普遍趋势,国际间往来将更加便利,航空旅游行业或将迎来复苏。英国1。英国各类型签证都可以正常递签(中国境内英国签证中心全部开最新最全的泰国旅游攻略完整版泰国一直是大多国人第一次出国旅行的首选地,这是一个具有两千多年佛教史的文明古国,在美丽富饶的国土上,有30,000多座充满神话色彩的古老寺院和金碧辉煌的宫殿。去泰国,总是玩不够的,用一片耀眼的金色,染一方淡雅的水墨小时候我以为金黄色是秋天的专属。直到遇见婺源,才知道黄色也可以代表春天。婺源是中国最具代表性的泉水之一。中国特有的徽文化与自然风光相结合,山川间有一种朦胧的薄雾。错落有致的油菜梯田简单生活第2天小长假出门活动今天是清明小长假第一天,生物钟还是在六点醒来。本来想的是看会书,7点起来做饭的,但是一直懒一直懒,直到830才起床。吃过饭洗洗衣服,孩子要去家附近的红色景点转转。出门的时候,已经快老挝人民太殷勤?漂亮姑娘见到游客就递水,游客老挝套路深如今人们生活水平的提高展现在方方面面,例如有很多人就拿得出钱也空得出时间来到处游玩。不过,如今的旅游业与从前相比,可没有那样纯粹了,各种套路与陷阱,商家们也是想方设法地去挣游客的钱大妈春日踏青指南春日生活打卡季朋友发了张照片给我,题为北京大妈的幸福生活。文化人怼人真是不一样。照片明里是粉嫩的樱花,暗里是抖落着围巾的大妈。只此一图一句,我就能想象出漫山遍野的她在丛中笑。昨日我春日京城各地最佳赏花处东风随春归,发我枝上花。阳春三月,万物复苏,京城当前已进入春花的观赏季。梅花迎春花桃花杏花玉兰紫荆地黄郁金香丁香海棠花牡丹将次第开放,从3月一直会持续到5月。在这里推荐了北京市各区春日暖阳,花海赴春,漫山梨花开,许你一片童话世界春风,吹醒了寂静的山野,吹开了漫山的繁花。在这迷人的春光里,秀美的风景就如同一副绚丽多彩的画卷正徐徐展开,春天之所以美丽,或许就是因为花儿的装扮吧。漫山遍野花满溪,千朵万朵压枝低。春日自驾好时光富乐山一日游富乐山一日欢乐游!登高望远,游子怎能不思乡,踏青游玩,神兽怎会不欢愉。距离很近,只十分钟左右的路程,因为已过了高峰期,路程相对顺畅,车还未完全发挥实力便已到达目的地。城区唯一每年我春日去看海一直以为,海水是蓝的,蔚蓝色,成了大海的概念。可自三亚归来,老梦见亚龙湾那片海,那是片深绿的海,绿得让你心醉的海。每当梦醒,心里总是怅然失落,那片绿绿的海,只能相会在梦里。一个春雨
天文界大神伽利略,不仅发明天文望远镜,就连木星也是他发现的每当夜晚抬头仰望星空的时候,你是否会发现满天繁星呢。在这些星星中就有一些是行星了,行星通常围绕着恒星转动且自身不发光,太阳系肉眼可见的行星有水星金星火星木星和土星,那其他行星又是被白云玩出新花样,各种形状说来就来,孙悟空都没它能变你有多久没有仰望天空了,那种抬头便能看见蓝天白云的时光你怀念吗?今天就让我们一起来欣赏一下各种各样的云朵吧。图为朵朵白云飘在湛蓝的天空下,天空中还挂着一道绚丽的彩虹。云的形成主要是春天托风给我寄信,信的内容不长,却满眼皆是春光无限日本东京5大节日祭之一的杜鹃花节日庆典每年都在4月下旬到5月下旬之间举行,届时根津神社内杜鹃花开满山野,像是一个个彩球装饰着这里。富士山是日本国内最高峰,也是日本重要国家象征之一,八张酷炫插画,带你了解赛博朋克风格,走进科幻的未来世界赛博朋克是一种科幻创作题材,以计算机或信息技术为主题,主旨是高科技,低生活。图为一幅科幻世界的山水画,插画里交错纵横的建筑风格体现了信息时代的信息化和全球化。赛博朋克风格插画的场景春天最后的美好,我们一起感受唤醒好春光春天的万物悄然复苏人们的目光投向了春景的绿意生机逐渐舒展的叶子,绽放开来的花朵处处是春天的气息可要说春天最令人动容的画面这些灵动的小动物们才是活力代表定格的灵动Topic这就是舞蹈,了解世界舞蹈日,邀你评选最美舞者每年的4月29日被联合国教科文组织下的国际舞蹈委员会定为世界舞蹈日,不仅是为了纪念现代芭蕾舞之父JeanGeorgesNoverre,也为了增强大众对舞蹈重要性的注意。舞蹈(Dan谷雨春季最后一个节气,不知不觉夏要来了谷雨是是二十四节气之一也是春季最后一个节气,在谷雨时节雨水会增多,气温回升加快,有利于小麦等谷类农作物的生长,也是农忙的时候。谷雨节气,古时人们有走谷雨品谷雨茶赏牡丹花等习俗。谷雨一组老照片,带你欣赏特色头纱,感受上个世纪的浪漫头纱作为一种特殊的装饰品,种类繁多,样式各异,有蕾丝的轻纱的拖地的接下来通过一组老照片来欣赏一下不同款式的特色头纱吧。图为1937年一个模特披戴头纱的照片,轻纱型的中长款头纱将整个划重点,读书日不只是读书,还有更重要的事情要做世界读书日是联合国教科文组织在1995年11月15日确定的国际性活动节日,时间定为每年的4月23日。该节日的目的是推动更多的人去阅读和写作,希望所有人都能尊重并保护知识产权。联合国花花世界迷人眼,各种颜色任你选,马蹄莲到底有几副面孔?马蹄莲属多年生粗壮草本,叶片较厚,呈绿色,心状箭形或箭形,先端锐尖渐尖或具尾状尖头,基部心形,喜疏松肥沃腐殖质丰富的粘壤土。马蹄莲的颜色有许多,各种颜色对应的花语也各有不同。马蹄莲耳熟能详的BGM,其实都是王者,给动物们配上简直天秀起源于意大利文艺复兴时期的芭蕾舞可以算作是最有特色的舞蹈种类之一了,图为一只小鸭子正在表演芭蕾舞,踮起脚尖,提起裙边,舞步翩翩,呼吸浅浅,它跳着芭蕾舞一步一步,一圈一圈趁你不注意就