Go开发文件服务fs.go深入探讨之架构

开发 架构
通过两行代码可以看到,代码比较简易,请求到达然后发送文件,要什么就发什么。这同时也是它的缺点,因为不能对文件进行更细粒度的处理,这个在后文中会详述。

架构

首先看下FileServer的组成:

接口称为FileSystem,有一个Open方法。但实现它的却是名为Dir的类型(其实是一个string),为什么起名为Dir呢?

作者想了下,认为Dir是目录的意思,而文件系统(FileSystem)就好比是一个目录包裹一系列文件,于是这个目录本身就是FileSystem,如下图所示

如果这样理解,那么FileSystem的Open方法,就是以该Dir名为目录,再加上具体的文件路径构成一个完整的路径,而源码中确实也是这样做的。

FileServer内部实例化一个fileHandler,因此一个Server其实是一个fileHandler。

两句代码的分析

fs := http.FileServer(http.Dir("./assets/"))
http.Handle("/static/", http.StripPrefix("/static", fs))

分析

这两句代码是常见的静态文件处理方式,http.Dir指定了文件系统(也就是一个目录)为./assets/。它是一个相对路径,相对于当前目录,下面解释下什么是当前目录。

如果是在IDE中开发,比如在Goland中,当前目录就是项目所在的目录;而如果是直接运行可执行程序,那么当前目录就是可执行程序所在目录。两者一般是不一样的,需要注意。

http.FileServer返回的是一个Handler,因此可以直接用在http.Handle中。

完整解释:创建一个Handler名为fs,当路由以"/static/"开头时,转交给该处理器处理,而http.StripPrefix首先将前缀剔除掉。比如,请求的路由是/static/cat.jpg,剔除之后得到/cat.jpg。将该路径和目录名组合得到./assets/cat.jpg,就是完整的相对路径。

得到路径之后下一步怎么处理呢?按照正常逻辑,就是打开文件,因此,一个文件服务处理就是将文件打开并倒进响应Body的过程

优点和缺点

通过两行代码可以看到,代码比较简易,请求到达然后发送文件,要什么就发什么。这同时也是它的缺点,因为不能对文件进行更细粒度的处理,这个在后文中会详述。

总结

文件服务是一个普通的Handler,请求到达,服务器打开文件,然后将文件内容倒进响应Body返回。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2021-09-03 12:33:36

语言并发下载器

2010-04-15 14:02:32

Oracle网络服务

2009-12-23 16:13:00

WPF Attache

2010-07-21 09:38:15

PHP缓存技术

2010-11-22 14:18:32

MySQL锁机制

2021-05-17 05:36:02

CSS 文字动画技巧

2009-11-20 17:17:08

Oracle函数索引

2011-02-25 09:23:00

Java类加载器

2010-03-05 13:44:00

Python序列

2009-08-27 11:27:58

foreach语句C# foreach语

2015-09-02 08:57:56

JavaHashMap工作原理

2023-01-12 17:18:06

数据库多云

2010-03-31 14:58:03

云计算

2012-02-28 14:43:43

2017-01-03 17:57:46

Android异步精髓Handler

2024-01-26 06:42:05

Redis数据结构

2009-12-11 11:08:31

静态路由策略

2009-12-07 16:07:03

PHP类的继承

2009-12-14 14:40:10

Ruby全局域变量

2009-10-16 09:17:39

屏蔽布线系统
点赞
收藏

51CTO技术栈公众号