2015-05-31 44 views
1

我正在學習golang - 編寫小型網絡博客,並編寫路由器(我知道有幾個 - 大猩猩mux,馬提尼等)。保留結構以後使用它的數據

我有簡單的結構

type Routes struct {  
    method string 
    pattern string 
    handler Handler 
} 

和一些正則表達式匹配器。但我不明白我如何保留我將在一個地方定義的所有路線。正在使用片斷結構的好主意(如 []Routes)將它們全部放在一起?

P.S.這是爲了個人瞭解它如何一起工作

回答

1

你的問題並沒有很好的定義。你告訴我們你想要基於正則表達式來實現路由功能,但是你沒有告訴我們你想達到什麼樣的任務,這極大地影響了要使用的最優或最好的數據結構。

你已經提到你知道很多其他的開源實現,也許你應該檢查它們的源代碼。

This answer也可能對您有所幫助,它顯示瞭如何使用正則表達式來執行路由功能的基本實現的簡單實現。

如果你只是想註冊正則表達式,如果匹配請求路徑,然後轉發服務到Handler,是的,將「規則」存儲在[]Routes是一個可行和簡單的選項。

事情要記住:

  • 我肯定會編譯提前正則表達式,並將結果和每一個是資源的一種嚴重的浪費時間把它們編成。因此,您的Routes結構應該包含類型*regexp.Regexp而不是模式的字段(您也可以保留string模式,例如,用於調試目的)。

  • 如果您的Routes結構變得更大,我會考慮將指針存儲在切片中而不是結構值,例如,因爲每當你循環它們時(例如在每個請求中查看哪些匹配項),或者每當你從Routes之一創建局部變量時,都會從值中創建一個副本。與複製快速的指針相比,複製大型結構效率低下。

+0

感謝您的建議,但你能解釋更多關於編譯正則表達式嗎?你的意思是編譯正則表達式? – Avdept

+0

@Avdept如果你在Go中有一個正則表達式作爲'string',如果你想檢查正則表達式匹配另一個'string',你可以用''Regexp.MatchString()'](https: //golang.org/pkg/regexp/#Regexp.MatchString)方法。 'Regexp'是一個'string'正則表達式的編譯(分析)版本。你可以編譯一個regexp'string',並用['regexp.Compile()'](https://golang.org/pkg/regexp/#Compile)或['regexp.MustCompile()]獲得一個Regexp值。例如'](https://golang.org/pkg/regexp/#MustCompile)函數。 – icza

相關問題