Go開發(fā)文件服務fs.go深入探討之架構
架構
首先看下FileServer的組成:
接口稱為FileSystem,有一個Open方法。但實現(xiàn)它的卻是名為Dir的類型(其實是一個string),為什么起名為Dir呢?
作者想了下,認為Dir是目錄的意思,而文件系統(tǒng)(FileSystem)就好比是一個目錄包裹一系列文件,于是這個目錄本身就是FileSystem,如下圖所示
如果這樣理解,那么FileSystem的Open方法,就是以該Dir名為目錄,再加上具體的文件路徑構成一個完整的路徑,而源碼中確實也是這樣做的。
FileServer內部實例化一個fileHandler,因此一個Server其實是一個fileHandler。
兩句代碼的分析
分析
這兩句代碼是常見的靜態(tài)文件處理方式,http.Dir指定了文件系統(tǒng)(也就是一個目錄)為./assets/。它是一個相對路徑,相對于當前目錄,下面解釋下什么是當前目錄。
如果是在IDE中開發(fā),比如在Goland中,當前目錄就是項目所在的目錄;而如果是直接運行可執(zhí)行程序,那么當前目錄就是可執(zhí)行程序所在目錄。兩者一般是不一樣的,需要注意。
http.FileServer返回的是一個Handler,因此可以直接用在http.Handle中。
完整解釋:創(chuàng)建一個Handler名為fs,當路由以"/static/"開頭時,轉交給該處理器處理,而http.StripPrefix首先將前綴剔除掉。比如,請求的路由是/static/cat.jpg,剔除之后得到/cat.jpg。將該路徑和目錄名組合得到./assets/cat.jpg,就是完整的相對路徑。
得到路徑之后下一步怎么處理呢?按照正常邏輯,就是打開文件,因此,一個文件服務處理就是將文件打開并倒進響應Body的過程。
優(yōu)點和缺點
通過兩行代碼可以看到,代碼比較簡易,請求到達然后發(fā)送文件,要什么就發(fā)什么。這同時也是它的缺點,因為不能對文件進行更細粒度的處理,這個在后文中會詳述。
總結
文件服務是一個普通的Handler,請求到達,服務器打開文件,然后將文件內容倒進響應Body返回。