gorrilla Context包深入學習

2021-09-25 19:29:24 字數 3764 閱讀 4434

做過web開發的同學肯定都知道,我們經常使用r *http.request這個變數來獲取我們希望獲得的引數,但是我們經常遇到這樣乙個場景,我們需要為我們的r設定更多的key-value形式的附加值,一般我們都會儲存在乙個map物件中,用的時候再從裡面取出,golang考慮到這樣乙個場景,為我們提供了乙個context,這裡的context並不是上下文的意思,屬於另外乙個這個包github.com/gorilla/context

使用這個庫之前,我們同樣用golang中的經典獲取包的方式go get命令來獲取

go get github.com/gorilla/context
設定
context.set(r, "user", "wuyazi")

context.set(r, "age", 21)

在上面的這個函式裡,r即是*http.request我們設定了乙個key為user,value為wuyazi,另乙個key為age,value為21。

獲取

user := context.get(r, "user").(string)

age := context.get(r, "age").(int)

獲取我們使用乙個get()的函式,該函式會返回乙個inte***ce{}型別的值,然後我們使用斷言,進行型別轉換,就能得到我們設定的資料了。

set()函式

這個函式接收了3個引數,這3個引數見名知意,這裡不再過多介紹,在這個函式裡,我們首先可以看到乙個關於寫入的鎖來保證資料的安全性,接著判斷我們傳入的r是否已經存在了我們的data變數裡。這裡的data是乙個雙層巢狀的map,定義如下所示

make(map[*http.request]map[inte***ce{}]inte***ce{})inte***ce{}型別則表示了我們可以存入各種型別的資料,如果判斷data[r]沒有值,則為它開闢乙個map,如果有值則直接存入,最後釋放寫入鎖。

在此函式中我們同樣看到了乙個變數datat,datat是用來儲存每個r對應map的宣告週期,下面會講到。

}get()函式

同樣在這個函式中我們用了乙個讀的鎖,來保證讀的安全性,裡面的邏輯很簡單,基本上和操作map一應,有值返回值,沒有值則返回nil。

}getok()函式

getok函式主要用於判斷key是否存在於map物件中,但是為什麼會有這個函式,可能有的同學會問,直接判斷value是否為nil不就行了,其實這裡需要注意的是,nil值同樣可以當做value儲存在map物件裡,因此有這樣乙個函式是有必要的,這裡面函式的邏輯同樣和操作map類似,用golang中特有的map物件判斷value的方式ok來判斷是否有值,如果key不存在將會返回nil,false

}getall()函式

這個函式是用來獲取所有的鍵值對,同樣用上面的例子使用方法如下:

allparams:=context.getall(r)

user:=allparams["user"].(string)

age:=allparams["age"].(int)

首先獲得map物件,然後使用斷言,比較簡單。在原始碼中,需要注意的是在進行map物件返回的時候,我們新建立了乙個和context大小一樣的map物件,用來進行map物件的copy,為什麼用這樣的方法,因為原來的context是乙個引用的型別,如果返回引用型別,呼叫者可能會破壞原來的map結構,因此返回乙個map的copy保證的map的安全性。我們在實際開發中同樣應該考慮到這一點。這樣我們的**才能更加具有健壯性。

}delete()和clear()函式

這兩個函式的實現原理和map物件相同,比較簡單,不在多闡述,原始碼如下:

func clear(r *http.request)purge()函式

上面我們提到了乙個datat的變數,在這個函式中我們就用到了,用它來對我們的key-value進行可控的清理,如果maxage<0則重新進行建立map,實現清理所有,如果當前時間-maxage的值大於建立的時間戳,則清理掉資料。

}clearhandler()函式

上面講到了手動清理,這裡則是自動清理,因為在我們進行開發時,隨著key-value的增加,我們大多數情況下會忘記清理,因此我們可以使用這個函式。函式的邏輯同樣很簡單,用golang提供的defer機制,當這個函式結束之前呼叫defer延遲,進行清理。

}以上的包是在go1.7引入之前經常使用,在1.7引入後,自帶的context包,即之前講過的上下文能夠很好的進行代替使用方法如下

設定資料

usercontext:=context.withvalue(context.background(),"user","wuyazi")

agecontext:=context.withvalue(usercontext,"age",21)

rcontext:=r.withcontext(agecontext)

獲得資料

user:=r.context().value("user").(string)

age:=r.context().value("age").(int)

Python深入學習之閉包

閉包 closure 是函式式程式設計的重要的語法結構。函式式程式設計是一種程式設計正規化 而面向過程程式設計和物件導向程式設計也都是程式設計正規化 在面向過程程式設計中,我們見到過函式 function 在物件導向程式設計中,我們見過物件 object 函式和物件的根本目的是以某種邏輯方式組織 並...

python深入學習筆記4 閉包

函式物件的作用域 函式物件的作用域與def所在層級相同。如 def line conf def line x return 2 x 1 print line 5 在作用域範圍內 line conf print line 5 超出作用域了閉包 函式是乙個物件,所以可以作為某一函式的返回結果。def l...

UIApplication深入學習

新建乙個任意型別的ios應用工程,加入我們在class prefix輸入是tc,我們可以看到工程中生成乙個類 在main函式中,autoreleasepool 函式中 說明 當應用程式將要入非活動狀態執行,在此期間,應用程式不接收訊息或事件。比如來 了。說明 當應用程式入活動狀態執行,這個剛好跟上面...