架构
首先看下FileServer的组成:
接口称为FileSystem,有一个Open方法。但实现它的却是名为Dir的类型(其实是一个string),为什么起名为Dir呢?
作者想了下,认为Dir是目录的意思,而文件系统(FileSystem)就好比是一个目录包裹一系列文件,于是这个目录本身就是FileSystem,如下图所示
如果这样理解,那么FileSystem的Open方法,就是以该Dir名为目录,再加上具体的文件路径构成一个完整的路径,而源码中确实也是这样做的。
FileServer内部实例化一个fileHandler,因此一个Server其实是一个fileHandler。
两句代码的分析
分析
这两句代码是常见的静态文件处理方式,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返回。