From 3968bf33e768f06bc4fc140e7952cbe3d8453b0c Mon Sep 17 00:00:00 2001 From: Dmitry Bochkarev Date: Thu, 30 May 2013 20:34:35 +0600 Subject: [PATCH] GetOk(r, key) (value, ok) --- context.go | 11 +++++++++++ context_test.go | 18 ++++++++++++++++-- doc.go | 4 +++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/context.go b/context.go index fe5b6ad..35d6556 100644 --- a/context.go +++ b/context.go @@ -37,6 +37,17 @@ func Get(r *http.Request, key interface{}) interface{} { return nil } +// GetOk returns stored value and presence state like multi-value return of map access. +func GetOk(r *http.Request, key interface{}) (interface{}, bool) { + mutex.Lock() + defer mutex.Unlock() + if _, ok := data[r]; ok { + value, ok := data[r][key] + return value, ok + } + return nil, false +} + // Delete removes a value stored for a given key in a given request. func Delete(r *http.Request, key interface{}) { mutex.Lock() diff --git a/context_test.go b/context_test.go index 314a0b6..ff9e2ad 100644 --- a/context_test.go +++ b/context_test.go @@ -37,14 +37,28 @@ func TestContext(t *testing.T) { assertEqual(Get(r, key2), "2") assertEqual(len(data[r]), 2) + //GetOk + value, ok := GetOk(r, key1) + assertEqual(value, "1") + assertEqual(ok, true) + + value, ok = GetOk(r, "not exists") + assertEqual(value, nil) + assertEqual(ok, false) + + Set(r, "nil value", nil) + value, ok = GetOk(r, "nil value") + assertEqual(value, nil) + assertEqual(ok, true) + // Delete() Delete(r, key1) assertEqual(Get(r, key1), nil) - assertEqual(len(data[r]), 1) + assertEqual(len(data[r]), 2) Delete(r, key2) assertEqual(Get(r, key2), nil) - assertEqual(len(data[r]), 0) + assertEqual(len(data[r]), 1) // Clear() Clear(r) diff --git a/doc.go b/doc.go index 2eca20a..c807928 100644 --- a/doc.go +++ b/doc.go @@ -37,8 +37,10 @@ The application can later access the variable using the same key you provided: func MyHandler(w http.ResponseWriter, r *http.Request) { // val is "bar". - val = context.Get(r, foo.MyKey) + val := context.Get(r, foo.MyKey) + // returns true + ok := context.Has(r, foo.MyKey) // ... }