博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go实现简单的K-V存储
阅读量:6303 次
发布时间:2019-06-22

本文共 3486 字,大约阅读时间需要 11 分钟。

Go实现简单的K-V存储

使用Go实现简单的K-V存储,包括基本的增删改查功能。

本节代码将实现K-V存储的四个基本功能:

  • 添加新元素
  • 基于key删除已有的元素
  • 给定key查找对应value
  • 修改key对应的value

我们将这四个功能命名为ADD,DELETE,LOOKUP,CHANGE,完成这四个基本功能,你将会对K-V存储的实现有一个全面的了解。另外,当你输入STOP时整个程序就会停止,输入PRINT命令就会打印出当前K-V存储的所有内容。

本节的keyValue.go将分为5个代码段解释。

第一部分:

package mainimport (   "bufio"   "fmt"   "os"   "strings")type myElement struct {   Name string   SurName string   Id string}var DATA = make(map[string]myElement)复制代码

我们使用原生的Go map来实现K-V存储,因为内置的数据结构往往执行效率更高。map变量被声明为全局变量,其k为string类型,v为myElement类型,myElement是自定义的结构体。

第二部分代码:

func ADD(k string,n myElement) bool {   if k == "" {      return false   }   if LOOKUP(k) == nil {      DATA[k] = n      return true   }   return false}func DELETE(k string) bool {   if LOOKUP(k) != nil {      delete(DATA, k)      return true   }   return false}复制代码

这部分代码实现了命令行ADD和DELETE,用户在执行ADD命令时,如果没有携带足够的参数,我们要保证该操作不会失败,意味着myElement中对应的字段为空字符串。然而如果你要添加的key已经存在了,就会报错(K-V存储不允许重复key出现)而不是修改对应的值。

第三部分代码:

func LOOKUP(k string) *myElement  {   _, ok := DATA[k]   if ok {      n := DATA[k]      return &n   } else {      return nil   }}func CHANGE(k string, n myElement) bool {   DATA[k] = n   return true}func PRINT()  {   for k, v := range DATA {      fmt.Printf("key: %s value: %v",k,v)   }}复制代码

该代码段实现了LOOKUP与CHANGE功能,如果你要修改的key不存储,程序会自动将其存储。

PRINT命令能够打印出目前所有K-V存储的内容。

第四部分代码:

func main() {   scanner := bufio.NewScanner(os.Stdin)   for scanner.Scan() {      text := scanner.Text()      text = strings.TrimSpace(text)      tokens := strings.Fields(text)      switch len(tokens) {      case 0:         continue      case 1:         tokens = append(tokens,"")         tokens = append(tokens,"")         tokens = append(tokens,"")         tokens = append(tokens,"")      case 2:         tokens = append(tokens,"")         tokens = append(tokens,"")         tokens = append(tokens,"")      case 3:         tokens = append(tokens,"")         tokens = append(tokens,"")      case 4:         tokens = append(tokens,"")            }复制代码

该部分代码读取用户的输入。首先,for循环将保证程序一直等待用户的输入,接下来使用tokens切片保证至少有5个元素的输入,即使只有ADD命令需要5个参数。如果用户不想在使用ADD命令时出现空字符串值,就需要这样输入:ADD aKey Field1 Field2 Field3。

最后一部分代码:

switch tokens[0] {      case "PRINT":         PRINT()      case "STOP":         return      case "DELETE":         if !DELETE(tokens[1]) {            fmt.Println("Delete operations failed")         }      case "ADD":         n := myElement{tokens[2],tokens[3],tokens[4]}         if !ADD(tokens[1],n) {            fmt.Println("Add operation failed")         }      case "LOOKUP":         n := LOOKUP(tokens[1])         if n != nil {            fmt.Printf("%v\n",n)         }      case "CHANGE":         n := myElement{tokens[2],tokens[3],tokens[4]}         if !CHANGE(tokens[1],n) {            fmt.Println("Update operation failed")         }      default:         fmt.Println("Unknown command - please try again!")      }   }}复制代码

这部分代码处理用户的输入。switch的使用使得程序的逻辑设计看上去十分清晰,能够将程序员从冗余的if...else中拯救出来。

执行keyValue.go得到如下输出:

$ go run keyValue.goUNKNOWNUnknown command - please try again!ADD 123 1 2 3ADD 234 2 3 4ADD 234Add operation failedADD 345PRINTkey: 123 value: {1 2 3}key: 234 value: {2 3 4}key: 345 value: {  }CHANGE 345 3 4 5PRINTkey: 345 value: {3 4 5}key: 123 value: {1 2 3}key: 234 value: {2 3 4}DELETE 345PRINTkey: 123 value: {1 2 3}key: 234 value: {2 3 4}ADD 567 -5 -6 -7PRINTkey: 123 value: {1 2 3}key: 234 value: {2 3 4}key: 567 value: {-5 -6 -7}CHANGE 567PRINTkey: 567 value: {  }key: 123 value: {1 2 3}key: 234 value: {2 3 4}  STOP复制代码

本文节选自

查看并运行

完整阅读本书

提出你的建议

转载地址:http://tmfxa.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
Nginx+mysql+php-fpm负载均衡配置实例
查看>>
shell脚本操作mysql数据库 (部份参考)
查看>>
MySql之基于ssl安全连接的主从复制
查看>>
informix的逻辑日志和物理日志分析
查看>>
VMware.Workstation Linux与windows实现文件夹共享
查看>>
ARM inlinehook小结
查看>>
wordpress admin https + nginx反向代理配置
查看>>
管理/var/spool/clientmqueue/下的大文件
查看>>
HTML学习笔记1—HTML基础
查看>>
mysql dba系统学习(20)mysql存储引擎MyISAM
查看>>
Win8转移应用商店的安装目录,用户目录
查看>>
centos 5.5 64 php imagick 模块错误处理记录
查看>>
apache中文url日志分析--php十六进制字符串转换
查看>>
Ansible--playbook介绍
查看>>
浅谈代理
查看>>
php创建桌面快捷方式实现方法
查看>>
基于jquery实现的超酷动画源码
查看>>
fl包下的TransitionManager的使用
查看>>
Factorialize a Number
查看>>