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

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

在诗意的大地行走书写中国的世界遗产城市著书者说作者邵甬(同济大学建筑与城市规划学院教授)中国历史城市数量之多特色之鲜明,举世闻名。这些城市拥有优美的自然环境独特的城市格局众多名胜古迹,或雄浑方正,或灵动舒展,或虽弹丸之1月10日起太昊陵景区暂停开放大象新闻记者田林李康1月9日,太昊陵文物保护中心发布通知,太昊陵景区自2022年1月10日起暂停对外开放,恢复开放时间另行通知。以下附通知全文为了保证广大游客的身心健康,接上级通知广东昨起暂停跨省团队游及机票酒店业务羊城晚报全媒体记者黎存根报道记者9日从广东省旅行社行业协会获悉,即日起省内各旅行社及在线旅游企业立即暂停经营跨省团队旅游及机票酒店业务,待省内全部为低风险地区后,可自行恢复经营跨省一望无际的高大耸立在那里的长城汽车由北京出发,行驶不到一小时,我便置身于峰峦起伏的群山中了。透过玻璃窗,眼前的景像使我惊叹不已。八月的燕山,青翠欲滴,长城蜿蜒起伏在山脊之上,时隐时现,仰望,它像一条伏卧在崇山峻荆楚大地,大美湖北湖北是荆楚文化发源之地,孕育了灿烂的中华文明,自古人杰地灵,留下无数文化瑰宝。伯牙子期相会于此,有了高山流水觅知音的佳话无数文人墨客登临黄鹤楼,感叹江城好风光。当你问一个湖北人你家北京徒步登山寻迹山间冰溪冰瀑自然美景,门头沟西胡林自驾游出行日期2022年1月5日,周三先上总结门票无停车免费位置北京门头沟斋堂镇西胡林村导航东胡林人遗址总里程17公里左右(环线)累计爬升430米左右用时6小时左右(正常比我们快)路况穿到越南旅游的男游客,不是为欣赏风景,而是为了当地姑娘?现如今出国游玩已经变成了一种趋势,人们趁着外出游玩的机会,适当地放松自己。毕竟旅游行业慢慢地趋于成熟。(此处已添加小程序,请到今日头条客户端查看)而我国人口众多,许多地方为了吸引国银装素裹滑雪场风景旖旎大汶河汶河潺潺水流急,徂徕巍巍冰雪丽。碧水浪花苍松绿,飞花逐月百鸟啼。水面如镜无杂尘,岸边垂钓有彩旗。古河风采仍依旧,沧海桑田留青史。隆冬时节,浓雾弥漫。腊月初七,我游览了徂徕山滑雪场和英国游客拍下北京央视大楼建筑,引发热议中国建设很强大其中很有代表性的就像位于上海的中心大厦,其建筑主体为地上127层,地下5层,总高为632米,是当前中国第一高楼!上海中心大厦建筑于2016年3月全部完工,大厦设计以龙型作为蓝本,是旅游博主拍视频发布逃票攻略!景区回应!网友热议近日一名从事旅游视频拍摄的博主发出一篇黄果树大瀑布的进入攻略引发网友关注视频里这名博主介绍了他穿过一条小路然后沿着村路山路等行走最终到了黄果树瀑布这条视频引起许多网友的关注其中评论登顶非洲第二高峰肯尼亚山Photoby波布非洲今天小布要和大家介绍的是一座比乞力马扎罗还独特的山,她是非洲仅次于乞力马扎罗的第二高峰,是东非大裂谷最大的死火山,是真正意义上的赤道上的雪山,是肯尼亚国名的来
去北戴河旅游,是住在海边农家院划算,还是住市里划算?有什么好的建议?我的北戴河之行是安排在八月十五过后,刚刚过了北戴河的旺季,天气又没有太冷还可以下水。因为听说旺季沙滩人非常多,所以我的原则就是人少,离沙滩近,价格不要太高。我选择了外交人员宾馆,据白俄罗斯已经正式免签,送你一个白俄旅游全攻略中国白罗斯两国对普通护照正式免签生效!免签正式生效!以后,我们的朋友,父母,家人,到白俄再也不用繁琐的邀请函旅游,探亲再也不用到白俄驻华使馆办理签证了(说实话,真厌恶办理签证那小哥中国旅游界良心景区,3月游客免费游肇庆七星岩景区因七座排列如北斗七星的石灰岩峰而得名,景区由星湖阆风岩玉屏岩石室岩天柱岩蟾蜍岩仙掌岩阿坡岩七座石灰岩山峰组成,游览七星岩除却其秀丽美景之外,尤如科谱一部精彩的人文历史距乌镇仅30分钟车程,私藏着一个更为小众古镇,50元尝遍小吃尽管这几年来,很多游客总会觉得古镇太过于商业化,仿佛早已经不是我们心目中那样淳朴的印象,但这些古镇曾经也都是让人憧憬,如果换一种方式去欣赏,古镇的安静依然如初。江南地区的古镇众多,浙江这十个绝美古镇,都不收门票,周末自驾游玩好去处浙江的古镇,大大小小不下几十座。除了最知名的乌镇西塘,浙江还有不少小众的古镇,风景一样美,关键不收门票,免费的。小编对这些古镇做了个盘点,出发寻找绝世美景吧。1安昌古镇(绍兴)始建数据告诉你,北京到底有多大!凡在北京生活过的人,都说北京很大在北京谈恋爱,只要不在一个区,都算是异地恋随便出趟门逛个景点,来回路上的时间就足够刷两三部90分钟时长的电影。这样说,大多数人对北京之大,还是很模糊一系列壳型酒店和旋转公寓塔围绕中心岛而建海水云天,湖光山色风景十分绮丽近些年前往菲律宾旅游的人越来越多度假村这项旅游产业在菲律宾办得蒸蒸日上就在不久前有一位比利时设计师为菲律宾设计了一个螺旋形的度假村位于其著名的珊瑚三角石家庄抱犊寨一日游,周末登山游玩的人很多抱犊山,旧名萆山,抱犊寨不是一个村庄,而是一座名山的名称。它位于鹿泉区境内,东距省会石家庄仅16公里,是一处集自然景观与人文景观于一地的旅游景区。2001年11月,抱犊寨景区被国家你去过最美的我国的地方是哪里?然乌湖最美的天然景区。然乌湖是大小两个景区,2018年去的然乌湖,风景超美挽如仙境一般。这么美的两个景区,还是非常良心的景区,全免费。我们先去的大然乌湖,在停车场(很小,也就停十几或许,你喜欢索玛花开吗?成都周边看花十四集说起来时间过得真快,从第一集写到现在已经第十四集了,想得到的春天的观赏花卉差不多就到这里了,谢谢大家的喜欢呀。把索玛花放到最后呢,是因为想用这个来压轴,我太喜欢这个花儿,以至于甚至3月最佳旅行地,春天来陕西必做的20件事!春天到了整个世界都在拼了命地绽放光彩春天来了鸟语花香开始莺声燕语哝哝作响春天近了细雨蒙蒙万千柔情化作相思恋情春天最适合做de事有两件一是谈恋爱,因为春心荡漾最多情二是去旅行,春意浓