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