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

一次编写,随处存储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!把它放在一起真的很有趣,我们很想知道你是否有反馈。

欢呼!刘国梁后继有人,国乒直拍正胶名将立大功,大逆转日本强敌北京时间9月14日,乒乓球WTT哈萨克斯坦赛上传来了一个令人振奋的消息与刘国梁一样同为直拍正胶快攻打法的运动员严升再次立大功,继上一站WTT阿曼赛吊打韩国名将安宰贤后,这次又爆冷3中超4消息!奥胖拒执教国足,巴尔加斯秀汉语,武磊身价仍居首第1个消息来自于中国男足。此前,据报道国足主帅李霄鹏将会卸任,而足协的目标则是一名了解中国足球的外籍教练,于是奥拉罗尤的名字再度和中国足球联系到了一起。不过,据记者徐毅报道,他联系雄鹿火箭或3换1交易?冠军中锋可辅佐申京,76人恐无缘哈登绝配上赛季季后赛,雄鹿在东部半决赛被绿军击败,虽然与米德尔顿的受伤有很大关系,但是雄鹿在外线缺少稳定得分点的劣势也暴露无遗。在今年的休赛期,绿军76人都有较为成功的引援,就连篮网也招募要把英超金靴送上替补席?孔蒂没有什么会永垂不朽9月14日凌晨,欧冠联赛D组展开第二轮较量,葡超葡萄牙体育队凭借补时阶段的两个进球,主场2比0击败英超托特纳姆热刺队。值得一提的是,孙兴慜虽然本场比赛首发,但他又一次未能取得进球。NBA,开出了罚单半年之前,ESPN报道称,太阳老板罗伯特萨沃是严重的种族歧视者。今天,NBA官方公布了审查结果。在进行大量走访,调查了超过80000份文件,以及咨询超过300名工作人员后。NBA方从储煤用地到运动空间这里被邓亚萍赞叹央广网北京9月14日消息(见习记者朱冠安)9月12日,在中关村丰台园由占地8000平方米的储煤用地更新而来的栋能魔王运动空间里,2022健康丰台人运动素质公开赛暨中关村科技园丰台园休赛期最大续约即将诞生!10亿美元终身合同,库里将成历史第四人当联盟工资帽大涨之后,天价合同漫天纷飞,动则千万上亿的超级顶薪,这已经不是新鲜事。想来也是合情合理的,球员们打出顶级的赛场表现后,一来可以提升主场球队的人气而拉升票房收入,二来能够阿森纳前副主席谈温格俱乐部未留一职给他,伤害了他1996年,法国教头温格首次执掌阿森纳,2018年,温格宣布离开阿森纳。在阿森纳执教生涯中,温格一共带队参加了1235场比赛,帮助队伍拿到了大大小小的17次冠军。对于温格离开阿森纳转会消息梅西C罗姆巴佩拜仁慕尼黑切尔西伯利西班牙人巴塞罗那来自罗马诺的消息,梅西不会在世界杯前做出决定。在接下来的几周或几个月内,梅西不会对自己的未来做出任何决定。专注于巴黎圣日耳曼,然后是世界杯,在世界杯之前没有任何决定或计划。尽管巴黎恭喜朱婷,恭喜张常宁,郎平最新去向曝光,球迷盼到,蔡斌安心众所周知,最近中国女排正在国内进行备战。随着世锦赛马上要到来,很多球迷一直非常期待中国女排能够取得好成绩。值得关注的是,在女排非常努力刻苦的训练的同时,女排的功勋主帅郎平在近期动态CBA三消息上海勇将自宣归来,常林打爆三内线,刘毅17分难救主爱国篮,爱CBA,我是洛姐,小伙伴们看完记得点赞!上海队下个赛季的目标是冲击CBA联赛的总冠军,这个休赛期球队再一次补强了本土球员阵容,原本上海队打算签下广东队的核心后卫球员赵睿,
荡气回肠!许昕31逆转广东悍将,樊振东击败林高远就夺冠乒乓球全国锦标赛男团决赛,上海队VS广东队,前两盘樊振东和林高远为各自的队伍拿下1分,第三盘老将许昕出战,他的对手是97年的李艺杰。最终双方经过鏖战,许昕31逆转击败李艺杰,个人在扣分处罚后中超保级形势大变天津日报讯(记者申炜)昨天下午,中国足球协会官方发布中国足球协会关于对部分职业足球俱乐部未能依规落实欠薪还款进行处罚的通知,对未能解决欠薪总额30的俱乐部进行扣分处罚。河北队和武汉全锦赛女团8强出炉,陈梦爆冷输球出局,孙颖莎大胜合影生日花墙11月4日,乒乓球全锦赛女团18决赛打响,国乒四大主力孙颖莎陈梦王艺迪陈幸同悉数登场亮相。陈梦1胜1负,山东队苦战五盘,不敌山西队,被淘汰出局,爆出超大冷门。孙颖莎带领的河北队陈幸给欠薪俱乐部和王大雷下罚单,挽回不了中超的形象今天的推送开始前,请允许勒勒向我曾经的偶像大连足球功勋中锋中国足坛名宿小王涛致以哀思。在我最初接触中国足球的那几年,小王涛是我眼中当之无愧的中国足坛顶级中锋,虽然我更钟爱辽小虎,但易建联出战世预赛悬念揭晓,阿联私人行程出炉,一哥忙着拍广告最近中国男篮进入世预赛的备战期间,在11月11号将会迎来11月份的首场比赛。因此对于中国男篮来说,应该是比较严峻时间相当紧的。从目前来看,这一次中国男篮总共宣布有17个球员进入这一小克鲁伊夫我们还未决定是否买人顶替皮克,下周会讨论直播吧11月6日讯今天,巴萨总监小克鲁伊夫接受了媒体采访,并谈到皮克球队的引援等话题。小克鲁伊夫说道皮克与巴萨的关系是一段美好的故事,因为他实现了自己儿时的梦想,我们说什么都不够,中炮过河车对屏风马弃马局,吴奕布局飞刀速胜布局飞刀图1选自97恒源祥杯全国象棋团体锦标赛,洪云对吴奕的一局精短对局。图1为中炮过河车对屏风马弃马局开始,第10回合红方走车三平四后形成的局面(想跳过布局的可直接拖到图5看黑方入局),恭喜DRX!获得S12总冠军!福克斯Logo超远三分压哨绝杀就在刚刚,S12总冠军出炉了恭喜DRX!DRX一路披荆斩棘,登上世界之巅,一举也打破了诸多纪录,他们是首支从入围赛开打,最终夺冠的战队同时也是首支以四号种子身份夺冠的战队!总冠军含国米旧将我讨厌尤文,今晚我们要战胜他们并将分差扩大到5分直播吧11月6日讯在社交媒体中,国米旧将达尔马特谈到了即将上演的意大利国家德比。达尔马特表示我们等待这场比赛已经有一周的时间了,这场比赛非常重要,原因有两点其一是因为对手是尤文,我战胜陈梦的韩菲儿并非运气爆棚11月4日,全国乒乓球锦标赛团体八强晋级赛中,让人颇感意外的是,国乒三大主力球员均输掉比赛。其中包括奥运冠军陈梦最近澳门冠军赛,新乡世界杯冠军王楚钦国乒主力球员林高远。中国乒乓球人30,巴萨不甘被扎心,莱万尽力了,哈维接班人浮现导读20222023赛季,注定是巴塞罗那发展历程中黑暗的一年,他们在夏季转会窗口中预支未来得到引援资金,也确实签下所喜爱的球员,如莱万多夫斯基,再比如拉菲尼亚,但结果又如何?在欧冠