最近在看 beego的原始碼,我選擇 beego一方面是因為我對 go語言很感興趣,另一方面在 goweb方面 beego也做的十分出色。模組化的設計、完善的文件和社群、強大的功能都是我對於 beego下手的推動力。
對於乙個解析專案的開始,我都想從配置來下手。所以這篇文章也是主要介紹了 beego在啟動過程中配置項的初始化過程。這也是關於 beego的第一篇文章,日後我們慢慢補坑的。
關於beego原始碼的注釋可以見我的github我會很努力的慢慢完善它的 :d
在開始之前先讓我們用 bee工具建立乙個 beego的應用。 專案的結構大概是這樣的
myproject
|—conf
|—controllers
|—default.go
|—main.go
|—modules
|—routers
|—router.go
|—static
|—css
|—img
|—js
|—tests
|—default_test.go
|—views
|—index.tpl
配置檔案
我們看下 beego中對於關於配置的一些檔案
beego目前支援 ini、xml、json、yaml格式的配置檔案解析,預設是 ini格式的解析
beego/config
這個包內放的就是不同解析器的檔案
beego/config.go
這個檔案就是用來初始化配置項的檔案
程式中的配置項
在 beego的啟動過程中,有兩個變數對配置項的初始化很重要,它們都在 beego/config.go:106被宣告
var (
bconfig *config
...配置檔案的路徑等變數
)
(關於 config這個結構體的定義可以參考 beego/config.go:50行開始的listen
、webconfig
、sessionconfig
、logconfig
這四個結構體,注意這裡的 config儲存的是程式執行是已經解析好的配置,而與下文提到的 beego/config/config介面無關)
innerconfig
config.configer
}
type
config inte***ce
看下它的介面定義我們就能猜到,它是為了給我們建立乙個 configer例項的.而 parse()和 parsedata()兩個函式在不同的配置器實現裡都有不同的實現,但他們的目的也就只有建立例項了。
看到這裡需要打斷下,因為又有乙個非常重要的變數需要我們認識
在 beego/config/config.go:85行有這樣一行
var adapters = make(map[strng]config)
為什麼說這個變數很重要呢,看看引數便知。map的 key是 string型別,也就是我們對應配置器的名稱(「ini」、」xml」等)
而第二個就是我們剛才定義了 parse()和parsedata()方法的 config介面,在同檔案的91行可以看到乙個叫 register的函式。在不同的配置器檔案的init()函式中,配置器都會通過 register函式向 adapters變數進行註冊(比如開啟 beego/config/json.go拖到檔案末尾就可以看到)
也就是說在 beego/config/包中所有原始檔的 init()函式執行完時, adapters就已經儲存了所有配置器了
這樣在 beego/config.go檔案中使用時只需要傳入配置器的名字,就能獲得對應的 config介面方法,呼叫方法後就能獲得實現了 configer介面所有方法的例項了!
那麼接下來就比較簡單了,不同的配置器只需要在自己檔案中實現 configer介面的所有方法就能成功的解析檔案了,這裡只需要根據不同格式進行配置項的處理即可
配置項的初始化大概就是這麼個流程
如果有錯誤非常希望您能指出讓我改正 :d
Beego原始碼解析 四 Hook函式
在前三篇文章中,介紹了 beego作為 web框架最基本的配置解析 路由機制 請求處理三個流程.現在我們應該就已經對 beego很是了解 後面的文章就讓我們重新頭開始看看除了這三個基本功能外,beego還做了什麼其他的事情吧 這篇文章會介紹在 beego啟動時呼叫的6個 hook函式 關於 beeg...
TFS原始碼解析一
tfs是乙個 分布式檔案系統,集群中主要涉及名字伺服器nameserver,以及資料伺服器dataserver,nameserver提供索引管理,dataserver提供資料儲存及管理。客戶端通過nameserver請求,獲取到dataserver中的資料路徑,然後通過dataserver獲取資料操...
caffe原始碼解析 一
用si載入 後 首先從caffe layer的實現看起,不同框架下最大的差異就在於層的實現也決定了層的靈活性 layer可以看成是乙個基類,下面存在data layer,activation neuron layers,vision layer,common layers,loss layer,各個...