热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

go语言学习——简单的key-valeu数据库的实现

写一个简单的key-value数据库,实现下面几个接口。db:new()>Db.db:destroy(Db)>ok.db:write(Key,Element,Db)&g

写一个简单的key-value数据库,实现下面几个接口。
db:new() => Db.
db:destroy(Db) => ok.
db:write(Key, Element, Db) => NewDb.
db:delete(Key, Db) => NewDb.
db:read(Key, Db) =>{ok, Element} | {error, instance}.
db:match(Element, Db) => [Key1, ..., KeyN].

例子:
1> c(db).
{ok,db}
2> Db = db:new().
[]
3> Db1 = db:write(111,222, Db).
[{111,222}]
4> Db2 = db:write(333, 444, Db1).
[{333,444},{111,222}]
5> db:read(111, Db2).
{ok,222}
6> Db3 = db:write(555, 444, Db2).
[{555,444},{333,444},{111,222}]
7> db:read(ola, Db3).
{error,instance}
8> db:match(444, Db3).
[555,333]
9> Db4 = db:delete(333, Db3).
[{555,444},{111,222}]
10> db:match(444, Db4).
[555]

  1 package main
  2 
  3 import (
  4     "fmt"
  5 )
  6 
  7 type M_Rcd map[string]string
  8 
  9 type T_Tbl struct {
 10     tblname string
 11     record  M_Rcd
 12 }
 13 
 14 type T_Kvdb struct {
 15     dbname string
 16     tbl    []T_Tbl
 17 }
 18 
 19 func (this *T_Kvdb) c(db T_Kvdb) {
 20     this.dbname = db.dbname
 21     this.tbl = make([]T_Tbl, 5)
 22     fmt.Printf("\ncreate db \"%s\" ok\n", this.dbname)
 23 }
 24 
 25 func (this *T_Kvdb) new(tblname string) T_Tbl {
 26     var tbl T_Tbl
 27     var length int
 28     tbl.tblname = tblname
 29     tbl.record = make(M_Rcd)
 30 
 31     this.tbl = append(this.tbl, tbl)
 32     length = len(this.tbl)
 33     fmt.Printf("add new table \"%s\" to db \"%s\" ok\n", tblname, this.dbname)
 34     return this.tbl[length-1]
 35 }
 36 
 37 func (this *T_Kvdb) destroy(tbl T_Tbl) {
 38     for i, _ := range this.tbl {
 39         if tbl.tblname == this.tbl[i].tblname {
 40             this.tbl = append(this.tbl[:i], this.tbl[i+1:]...)
 41             fmt.Println("destroy table ", tbl.tblname, " ok.\n")
 42             return
 43         }
 44     }
 45     fmt.Printf("no table \"%s\".\n", tbl.tblname)
 46 }
 47 
 48 func (this *T_Kvdb) read(key string, tbl T_Tbl) {
 49     for i, _ := range this.tbl {
 50         if tbl.tblname == this.tbl[i].tblname {
 51             for k, v := range this.tbl[i].record {
 52                 if k == key {
 53                     fmt.Println("{", v, "}")
 54                     return
 55                 }
 56             }
 57         }
 58     }
 59     fmt.Println("error, instance")
 60 }
 61 
 62 func (this *T_Kvdb) write(key string, value string, tbl T_Tbl) {
 63     fmt.Printf("add {%s,%s} to table \"%s\"", key, value, tbl.tblname)
 64     for i, _ := range this.tbl {
 65         if tbl.tblname == this.tbl[i].tblname {
 66             this.tbl[i].record[key] = value
 67             for k, v1 := range this.tbl[i].record {
 68                 fmt.Print("{", k, ",", v1, "}")
 69             }
 70             fmt.Printf("\n")
 71             return
 72         }
 73     }
 74     fmt.Print("no table \n", tbl.tblname)
 75 }
 76 
 77 func (this *T_Kvdb) delete(key string, tbl T_Tbl) {
 78     fmt.Printf("delete %s from table %s\n", key, tbl.tblname)
 79     fmt.Printf("[")
 80     for i, _ := range this.tbl {
 81         if tbl.tblname == this.tbl[i].tblname {
 82             delete(this.tbl[i].record, key)
 83             for k, v1 := range this.tbl[i].record {
 84                 fmt.Print("{", k, ",", v1, "}")
 85             }
 86             fmt.Printf("]\n")
 87             return
 88         }
 89     }
 90 }
 91 
 92 func (this *T_Kvdb) match(value string, tbl T_Tbl) {
 93     var value_in []string
 94 
 95     for i, _ := range this.tbl {
 96         if tbl.tblname == this.tbl[i].tblname {
 97             for k, v1 := range this.tbl[i].record {
 98                 if v1 == value {
 99                     value_in = append(value_in, k)
100                 }
101             }
102             fmt.Printf("%v\n", value_in)
103             return
104         }
105     }
106     value_in = append(value_in, "]")
107     fmt.Printf("%v\n", value_in)
108 }
109 
110 func (this *T_Kvdb) show() {
111     fmt.Print("show [")
112     for i, _ := range this.tbl {
113         for k, v1 := range this.tbl[i].record {
114             fmt.Print("{", k, ",", v1, "}")
115         }
116     }
117     fmt.Print("]\n\n")
118 }
dblib.go
 1 package main
 2 
 3 import ()
 4 
 5 func main() {
 6     var db1 T_Kvdb
 7     var tbl1 T_Tbl
 8     db1.dbname = "db1"
 9     db1.c(db1)
10     tbl1 = db1.new("tbl1")
11 
12     db1.write("111", "222", tbl1)
13     db1.show()
14     db1.read("111", tbl1)
15 
16     db1.write("333", "444", tbl1)
17     db1.show()
18     db1.read("333", tbl1)
19 
20     db1.read("555", tbl1)
21 
22     db1.write("555", "444", tbl1)
23     db1.show()
24 
25     db1.match("444", tbl1)
26 
27     db1.delete("333", tbl1)
28     db1.show()
29 
30     db1.destroy(tbl1)
31     db1.show()
32     tbl1.tblname = "a"
33     db1.destroy(tbl1)
34     db1.show()
35     db1.read("555", tbl1)
36 
37     db1.show()
38 }

 


推荐阅读
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
  • 1.什么是hashcode方法?hashcode方法返回对象的哈希码值在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有改变& ... [详细]
  • Smali代码注入
    以下的内容是对官方MIUIV4移植教程的补充,其中一些工具的使用就不在这里赘述,请大家参考官方教程。好的,话不多说,进入正题 ... [详细]
  • JavaBean和Map 转换 用反射方法实现
    由于JavaBean(实体类)结构与Map类似,我们可以把JavaBean与Map进行转换 ... [详细]
  • 认真一点学 Go:18. 并发
    收录于《Go基础系列》,作者:潇洒哥老苗。>>原文链接学到什么并发与并行的区别?什么是Goroutine?什么是通道?Goroutine如何通信?相关函数的使用?sel ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 看到平台银行对接方案写的demo确实还不错记个笔记互相学习学习packageapiimport(cryptotlsnetnethttpstringssynct ... [详细]
  • Java的核心库提供了大量的现成的类供我们使用。本节我们介绍几个常用的工具类。Math顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态 ... [详细]
  • 找出字符串中重复字符
    2019独角兽企业重金招聘Python工程师标准packagejavaBasic;importjava.util.HashMap;importjava.util.Map; ... [详细]
  • 突然觉得服务器ssh密码登录总是浪费一定量的时间,就想试试用sshKey进行登录。生成服务器sshkey和本地sshkey$ssh-keygen在服务器上生成一个authorize ... [详细]
  • 在实际的工作流业务开发中,当用户完成当前用户任务时,需要指定下一个用户任务的审核人。此时我们需要获取下一个节点的一些信息,来确定下一个用户任务的审核人有哪些。在实际工 ... [详细]
  • Lodash中文文档(v3.10.1)–“Collection”要领TranslatedbyPeckZegOriginalDocs:Lodashv3.10.1Docs乞助翻译文档的 ... [详细]
  • 本文目录一览:1、java中判断字符串是否为纯数字 ... [详细]
  • 本文主要分享【go协程模型】,技术文章【【GORM】模型关系-HasOne】为【VivaPython】投稿,如果你遇到GoWeb相关问题,本文相关知识或能到你。go协程模型一、概述HasO ... [详细]
  • 目录在Go语言项目中使用Zap日志库介绍默认的GoLogger日志库实现GoLogger设置Logger使用LoggerLogger的运行GoLogger的优势和劣势优势劣势Ube ... [详细]
author-avatar
用户9o05le1po7
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有