Beego原始碼解析 一 配置項初始化流程

2021-07-15 21:15:31 字數 2124 閱讀 6492

最近在看 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行開始的listenwebconfigsessionconfiglogconfig這四個結構體,注意這裡的 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,各個...