在 Web 编程中,经常需要处理用户请求数据,而用户请求数据的处理往往又涉及到数据存储与获取,支持存储数据的媒介很多,包括内存、文件系统、数据库等,接下来,学院君将花几个篇幅的教程来系统介绍 Go Web 编程中的数据存储与获取。

首先我们来看内存存储。

相较于磁盘文件和数据库,内存存取性能与效率是最高的,但是价格也是高昂的,这就导致内存存储空间有限;另外,内存数据不能持久化存储,如果系统断电或者异常重启,那么存储在内存中的数据都会消失。

因此,我们通常可以将当前运行程序需要处理的数据临时存放到内存中,以便提高程序性能,处理完成后持久化到磁盘(关系型数据库最终也是将数据存储到磁盘文件)中,从而充分利用内存的高性能和磁盘的大空间和数据可持久化,这样,即便系统重启后,再次启动程序也可以从磁盘文件读取之前存储的数据到内存进行初始化。

基于内存存取数据需要借助特定的数据结构,在 Go 语言中,这些数据结构包括基本类型(数字、字符串)、数组(array)、切片(slice)、字典(map)、结构体(struct)等,下面我们来简单演示如何基于 Go 语言的这些数据结构实现用户数据的临时存储。

在这个示例中,我们将创建用于存储文章数据的字典数据结构,并且在字典中存放多个通过结构体表示的文章数据(详细细节已经通过注释标注,这里不一一介绍了),最后从这些字典中读取数据并打印出来:

package main

import "fmt"

// 存放文章信息的 Post 结构体type Post struct {    Id int    Title string    Content string    Author string}

// 以 ID 字段为键的 Post 字典var PostsById map[int]*Post// 以作者字段为键的 Post 切片字典(一个作者可能对应多篇文章)var PostsByAuthor map[string][]*Post

// 添加 Post 实例到对应的字典func store(post Post) {    PostsById[post.Id] = &post    PostsByAuthor[post.Author] = append(PostsByAuthor[post.Author], &post)}

func main()  {    // 初始化字典    PostsById = make(map[int]*Post)    PostsByAuthor = make(map[string][]*Post)

    // 初始化文章信息    post1 := Post{Id: 1, Title: "PHP 全栈工程师指南", Content: "基于 Laravel + Vue.js 开发 Web 项目", Author: "学院君"}    post2 := Post{Id: 2, Title: "Go 入门教程", Content: "Go 语言基础语法和使用指南", Author: "学院君"}    post3 := Post{Id: 3, Title: "Go Web 编程", Content: "基于 Gin 框架构建 Web 项目", Author: "学院君"}    post4 := Post{Id: 4, Title: "微服务从入门到实践", Content: "基于 Laravel + go-micro 框架构建微服务", Author: "学院君"}

    // 存储文章到字典    store(post1)    store(post2)    store(post3)    store(post4)

    // 测试1:打印特定文章(从字典通过 ID 获取文章)    fmt.Println(PostsById[1])    fmt.Println(PostsById[2])

    // 测试2:打印特定文章(从字典通过作者获取文章切片)    for _, post := range PostsByAuthor["学院君"] {        fmt.Println(post)    }}

执行上述代码,打印结果如下:


其中前面两条是从 PostsById 字典中获取的数据,后面四条是从 PostsByAuthor 字典中获取的数据。

以上演示的是从内存数据结构中插入和查询数据,你还可以基于这些 Go 内置数据结构支持的语法实现数据修改和删除功能:

// 修改数据PostsById[1].Author = "学院君小号"// 删除数据delete(PostsByAuthor, "学院君")

再次打印字典:

// 测试3:再次打印字典fmt.Printf("%#v\n", PostsById[1])for _, post := range PostsByAuthor["学院君"] {    fmt.Println(post)}

可以看到这次 PostsById[1] 对应的 Post.Author 字段值变成了 学院君小号,而 PostsByAuthor 字典为空(未打印出任何信息):


这样一来,我们就结合 Go 内置的基本类型、切片、字典、结构体实现了简单的基于内存存储的数据增删改查功能,虽然效率是最高的,但是如前面所说,基于内存的数据存储无法实现持久化,另外,内存空间是有限的,几十几百条数据存储到内存还行,要是成千上万、乃至百万千万级数据存储到内存也是不现实的,要持久化存储大量数据,需要借助磁盘文件,下篇教程,学院君就来给大家介绍如何将用户数据存储到磁盘。

(全文完)


推荐阅读

  • 用 Go 开发桌面应用程序(GUI):Webview、Lorca 与 Electron

学习交流 Go 语言,扫码回复「进群」即可

站长 polarisxu

自己的原创文章

不限于 Go 技术

职场和创业经验

Go语言中文网

每天为你

分享 Go 知识

Go爱好者值得关注

ext store 数据修改_Go 数据存储篇(一):基于内存存储实现数据增删改查功能...相关推荐

  1. JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能

    JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能 JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能 html <table id=&q ...

  2. bootstrap 获取表格修改的结果_BootStrap实现带有增删改查功能的表格(DEMO详解)

    前言 bootstrap的表格样式,有类似EasyUI的表格,也有卡片式表格,放到移动端显示,各有千秋.但是BootStrap自带的表格是没有操作列的,网上的资源不少,但是都是比较单一.零碎,JS.C ...

  3. 欢迎来到Jsp编程课时十二——今天实现的目标是。@1将数据库的数据发送到浏览器。@2利用浏览器实现对数据库的增删改查操作。@3理解MVC三层架构的定义。

    完成项目会有以下的效果. JSP第二十课:Mvc+Mysql+Servlect+Jsp实现在浏览器上对数据库的增删改查. MVC全名是Model View Controller, 是 @@1模型(mo ...

  4. datatables增删改查php,jQuery+datatables插件实现Ajax加载数据与增删改查功能示例_白峰_前端开发者...

    本文实例讲述了 这里给大家分享一下我在项目中用datatables实现ajax加载数据与增删改查 注意,需要引入  搜索  新增  编辑  删除 职业姓名性别爱好 //点击查找 $(" ...

  5. boot spring 接口接收数据_基于 Spring Boot 实现 Restful 风格接口,实现增删改查功能...

    优质文章,及时送达 Spring Boot介绍 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配 ...

  6. mock模拟的数据能增删改查吗_Mock.js模拟数据,脱离后端独立开发,实现增删改查功能...

    在目前容近对端手近对端手近对端手近对端手近我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于 ...

  7. go-elasticSearch实战篇,带你学会elasticSearch的增删改查

    前言 哈喽,everybody,这是go-elastic学习系列教程第二篇文章.上一篇我们学习了ElasticSearch基础,如果还不懂基础的,可以先看一看上一篇文章,传送门.这一篇我们开始实战,写 ...

  8. Android前端通过Http协议与J2EE后端数据交互。工具eclipse、MySQL、Tomcat。通过JoSn获取数据。Android端实现对MySQL增删改查功能。

    Android:目录 HttpThread.java package com.example.saads; import java.io.BufferedReader; import java.io. ...

  9. mysql修改i数据库名_数据库操作之mysqli语句的增删改查0424/14:36

    基本的数据库操作 函数 mysqli_connect()连接数据库 mysqli_errno()错误编码 mysqli_error() 错误信息 mysqli_connect_errno() 数据库上 ...

最新文章

  1. python好学嘛-马哥教育官网-专业Linux培训班,Python培训机构
  2. CQYZOJ P1392 拔河问题
  3. .NET Core开发实战(第6课:作用域与对象释放行为)--学习笔记(下)
  4. 《SAS编程与数据挖掘商业案例》学习笔记之一
  5. 第6/24周 聚集索引
  6. C/C++面试题—合并两个排序的链表【递归和循环两种方式】
  7. 【分享】如何长时间高效学习
  8. 小结Python的中文处理(转)
  9. EasyClick 命令区域截图
  10. HTML中的三目表达式可以有多长
  11. Android Bluetooth架构
  12. 采用Windows PowerShell运行conda activate xx出现 C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1报错问题
  13. 致敬!那些在计算机科学领域闪耀的女性
  14. 论文阅读 | Combating Adversarial Misspellings with Robust Word Recognition
  15. (WIP)Start my first kernel journey (by quqi99)
  16. Oracle Smart Flash 新特性性能测试说明
  17. 一种超长行程螺旋传动机构
  18. 老子《道德经》里的投资之道
  19. 什么是二极管的反向恢复时间
  20. cass10.1+鸿业生成平纵横数据

热门文章

  1. Python入门100题 | 第065题
  2. QT中关于按钮以及菜单栏工具添加图标,以及快捷方式
  3. mysql常用命令--入门
  4. Google的AI模型是如何做A/B Test的
  5. 【机器学习PAI实践七】文本分析算法实现新闻自动分类
  6. Python知识图谱
  7. 谈阿里核心业务监控平台SunFire的技术架构
  8. 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控--转
  9. 字节跳动AI科学家王崇学生时代论文获“时间检验研究奖”
  10. 当我们在聊 Serverless 时你应该知道这些