golang簡單key/value資料庫(一)
#實現簡單的key-value型資料庫,我們需要以下兩點:
- 可供外部調用的API(net/http);
- 儲存結構(自帶的map)。
既然要實現簡單的資料庫:我們一切從簡,單線程內存型。
//main.gofunc main() { //待會要用到map cache := make(router.Cache) //監聽http http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { cache.Router(w, r) }) log.Fatal(http.ListenAndServe(":8070", nil))}
利用http請求調用Api
method: get url: http://127.0.0.1:8070/user 獲取user的值
method: post url: http://127.0.0.1:8070/ {"user": "1"} 新增user的值
method: put url: http://127.0.0.1:8070/ {"user": "2"} 修改user的值method: delete url: http://127.0.0.1:8070/user 刪除user的值
//router.gofunc (cache Cache) Router(w http.ResponseWriter, r *http.Request) { switch r.Method { case "POST": result := cache.post(r) fmt.Fprint(w, result) break case "GET": result := cache.get(r) fmt.Fprint(w, result) break case "PUT": result := cache.put(r) fmt.Fprint(w, result) break case "DELETE": result := cache.delete(r) fmt.Fprint(w, result) break default: fmt.Fprint(w, "does not support this method") }}//get resourcefunc (cache Cache) get(r *http.Request) string{ uri := r.RequestURI pathInfo := strings.Split(uri, "/") if len(pathInfo) == 0 { return "no path info" } key := pathInfo[1] if _, ok := cache[key]; ok { return cache[key] } else { return key + " is not exist" }}//add resourcefunc (cache Cache) post(r *http.Request) string { var response map[string]string body, err := ioutil.ReadAll(r.Body) if err != nil { panic(err) } err = json.Unmarshal(body, &response) if err != nil { panic(err) } if len(response) == 0 { return "none json in body" } for k, v := range response { if _, ok := cache[k]; ok { return k + "%s already exist" } cache[k] = v } return "success"}
詳細代碼:參見github。
下一章,解決並發請求。
推薦閱讀:
※PAT團體程序設計天梯賽-練習集答案
※紀念我HooK逝世的青春--XIgnCode3.TP.NP.HS.PP.GPK
※如何學習編程語言0x02
※如何編寫優質的API文檔?