数据存储可以分为三大类:文件存储、关系型的数据库(SQL)和非关系型的数据库(NoSQL)。本文主要讲述文件存储的实现方式。

文件存储根据不同的文件实现不同的存储方式:普通文件(如txt读写)、CSV文件、数据的序列化和持久化。

普通文件(如txt读写)

普通文件的读写可以使用os或io/ioutil包实现,两者的实现方式如下所示。

package mainimport ("fmt""io/ioutil""os"
)func main() {// 使用ioutil的WriteFile对文件执行写入操作data := []byte("Hello World!\n")err := ioutil.WriteFile("data1.txt", data, 0644)if err != nil {panic(err)}// 使用ioutil的ReadFile对文件执行读取操作read1, _ := ioutil.ReadFile("data1.txt")fmt.Print(string(read1))// 使用os的Create创建文件对象file1, _ := os.Create("data2.txt")// 使用defer,当程序执行结束将自动关闭文件对象file1defer file1.Close()// 使用文件对象file1对文件写入数据bytes, _ := file1.Write(data)fmt.Printf("Wrote %d bytes to file\n", bytes)// 使用os的Open打开文件data2.txt,生成文件对象file2file2, _ := os.Open("data2.txt")defer file2.Close()// 根据数据data的长度定义相应的数组read2 := make([]byte, len(data))// 由文件对象file2调用Read读取文件的数据内容,并将数据加载到数组read2bytes, _ = file2.Read(read2)fmt.Printf("Read %d bytes from file\n", bytes)fmt.Println(string(read2))
}

CSV文件

CSV 格式是一种文件格式,它可以让文本编辑器非常方便地读写由文本和数字组成的表格数据。CSV 的应用非常广泛,包括微软的 Excel 和苹果的 Numbers 在内的绝大多数电子表格程序都支持 CSV 格式,因此包括 Go 在内的很多编程语言都提供了能够生成和处理 CSV 文件数据的函数库。对 Go 语言来说,CSV 文件可以通过encoding/csv包进行操作,实现代码如下。

package mainimport ("encoding/csv""fmt""os""strconv"
)type Post struct {Id intContent stringAuthor string
}
func main() {// 创建文件posts.csvcsvFile, err := os.Create("posts.csv")if err != nil {panic(err)}defer csvFile.Close()// 创建数据allPosts := []Post{Post{Id: 1, Content: "Hello World!", Author: "Sau Sheong"},Post{Id: 2, Content: "Bonjour Monde!", Author: "Pierre"},Post{Id: 3, Content: "Hola Mundo!", Author: "Pedro"},Post{Id: 4, Content: "Greetings Earthlings!", Author: "Sau Sheong"},}// 使用csv的NewWriter方法对文件csvFile进行写入操作writer := csv.NewWriter(csvFile)// 遍历allPosts的每行数据,将每行数据依次写入CSV文件for _, post := range allPosts {// 将strconv.Itoa(post.Id)转换成字符串格式// 变量line以数组的形式表示line := []string{strconv.Itoa(post.Id), post.Content, post.Author}// 将数组line写入CSV文件err := writer.Write(line)if err != nil {panic(err)}}// 调用Flush方法来保证缓冲区中的所有数据都已经被正确地写入文件里面writer.Flush()// ………………………………………………………………………………………分界线………………………………………………………………………………………// 打开CSV文件file, err := os.Open("posts.csv")if err != nil {panic(err)}defer file.Close()// 使用csv的NewWriter方法对文件csvFile进行读取操作reader := csv.NewReader(file)// 设置每行数据里面的字段数量// 如果FieldsPerRecord的值为正数,并且CSV文件里面读取出的字段数量少于这个值时,Go就会抛出一个错误。// 如果FieldsPerRecord的值为0,那么读取器就会将读取到的第一条记录的字段数量用作FieldsPerRecord的值。// 如果FieldsPerRecord的值为负数,即使在读取过程中发现数据里面缺少了某些字段,读取进程也不会被中断。reader.FieldsPerRecord = -1// 一次读取所有数据// 多次读取可使用Read()record, err := reader.ReadAll()if err != nil {panic(err)}// 将已读取的数据依次输出var posts []Postfor _, item := range record {// 将字段Id转化为整型id, _ := strconv.ParseInt(item[0], 0, 0)post := Post{Id: int(id), Content: item[1], Author: item[2]}posts = append(posts, post)}fmt.Println(posts[0].Id)fmt.Println(posts[0].Content)fmt.Println(posts[0].Author)
}

数据的序列化和持久化

go的encoding/gob包用于管理由 gob 组成的流(stream),这是一种在编码器(encoder)和解码器(decoder)之间进行交换的二进制数据,这种数据原本是为序列化以及数据传输而设计的,但它也可以用于对数据进行持久化,并且为了让用户能够方便地对文件进行读写,编码器和解码器一般都会分别包裹起程序的写入器以及读取器。简单来说,go的encoding/gob包类似python的pickle模块,两者实现的功能是相同的。
但两者对比发现,encoding/gob包的使用方法却没有python的便捷,具体的使用过程如下所示。

package mainimport ("bytes""encoding/gob""fmt""io/ioutil"
)type Post struct {Id intContent stringAuthor string
}func store(data interface{}, filename string) {// 定义字节缓冲区对象buffer// 这是拥有Read方法和Write方法的可变长度(variable-sized)字节缓冲区// 换句话说,bytes.Buffer既是读取器也是写入器。buffer := new(bytes.Buffer)// 对缓冲区对象buffer设置编码,生成编码器encoderencoder := gob.NewEncoder(buffer)// 将数据data写入编码器encoder(字节缓冲区对象buffer)err := encoder.Encode(data)if err != nil {panic(err)}// 将缓冲区对象buffer的数据内容以字节的方式写入文件,生成二进制数据文件err = ioutil.WriteFile(filename, buffer.Bytes(), 0600)if err != nil {panic(err)}
}func load(data interface{}, filename string) {// 读取文件filename的数据内容raw, err := ioutil.ReadFile(filename)if err != nil {panic(err)}// 定义字节缓冲区对象buffer,并将文件内容raw加载到字节缓冲区对象bufferbuffer := bytes.NewBuffer(raw)// 在字节缓冲区对象buffer设置解码器decdec := gob.NewDecoder(buffer)// 将解码后的数据写入参数dataerr = dec.Decode(data)if err != nil {panic(err)}
}func main() {post := Post{Id: 1, Content: "Hello World!", Author: "Sau Sheong"}store(post, "post1")var postRead Postload(&postRead, "post1")fmt.Println(postRead.Id)
}

GoLang—使用net/http构建Web服务(文件数据存储)(上)相关推荐

  1. WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载

    MTOM消息优化传输机制主要应用于大量数据的传输,很多文章中也直接得出结论:使用MTOM文件传输效率高.为什么MTOM的数据传输效率会比别的方式要高?MTOM真的如此完美吗,它有什么不足?什么情况下使 ...

  2. WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发

    继WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发和WSE3.0构建Web服务安全(2):非对称加密.公钥.密钥.证书.签名的区别和联系以及X.509 证书的获得和管理之后,今天我 ...

  3. php构建soap_使用PHP构建Web服务

    php构建soap 在你开始前 关于本教程 本教程适用于希望通过在PHP中创建Web服务来跳入Web服务潮流PHP程序员. 您将通过使用PHP构建SOAP服务器来构建Web服务. 您将创建的Web服务 ...

  4. 如何设计云存储服务端数据存储加密机制

    云存储是一种新型的网络存储形式.随着云存储的广泛使用,云存储中的数据安全问题,如数据泄漏.数据篡改,如何设计云存储服务端数据存储加密机制也成了用户广泛关注的问题.云存储可以分为访问层.应用接口层.基础 ...

  5. 移动终端应用开发上机4服务与数据存储

    一.题目:设计一个APP 1.设计一个APP. (1)APP中有四个界面. (2)主界面(MainActivity)上有选项菜单,包含三个菜单项:"SD卡存储"."启动信 ...

  6. C语言实现通讯录【二】(动态内存开辟,文件数据存储)

    C语言实现通讯录[二] 在C语言实现通讯录[一]的基础上进行优化,主要实现两大模块: 动态内存开辟 文件数据存储 动态内存开辟: 考虑到通讯录的大小无法固定,在C语言实现通讯录[一]版本上定义一个足够 ...

  7. 利用 Celery 构建 Web 服务的后台任务调度模块

    来源:http://www.tuicool.com/articles/Enaeymm 任务队列在 Web 服务里的应用 在 Web2.0 后的时代,社交网站.搜索引擎的的迅猛发展对 Web 服务的后台 ...

  8. 使用 Ajax 调用 SOAP Web 服务,第 1 部分: 构建 Web 服务客户机

    James Snell (jasnell@us.ibm.com), 软件工程师,新兴技术, IBM James Snell 是 IBM 的 software group 中的 emerging Int ...

  9. Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)

    一,Nginx基本安全优化 1.1 调整参数隐藏Nginx软件版本号信息 一般来说,软件的漏洞都和版本有关,这个很像汽车的缺陷,同一批次的要有问题就都有问题,别的批次可能就都是好的.因此,我们应尽量隐 ...

最新文章

  1. C语言内存字节对齐小结
  2. 船体6自由度英文名称
  3. python模块分类_Python-模块分类及导入
  4. 你真的了解Python吗?这篇文章可以让你了解90%,赶紧收藏!
  5. (92)FPGA模块例化传递参数(parameter)
  6. C4D立体数字设计灵感,适合庆典应用|这波用得6啊!
  7. 恒德室内智能照明控制系统电路设计
  8. 通过笔记本wifi共享到以太网接口方法--使用嵌入式设备接入互联网
  9. home为什么是地点副词_为什么home有副词的词性?
  10. **DNS中A记录和CNAME记录的区别(转)
  11. Pytorch实现多层lstm
  12. 神秘的程序员头像包(附口罩版)第一发
  13. 小米温湿度计接入金桔通用蓝牙网关
  14. IDEA配置优化,idea配置大全
  15. 浅谈OSI七层模型及ICP/IP四层模型
  16. linux内核中linux中readl()和writel()函数---用于读写寄存器
  17. matlab simulink汽车优化设计遍历法
  18. 单机斗地主java下载_java单机斗地主
  19. Linux 服务器环境搭建及配置
  20. qpython 3h_python 逆向某咖啡小程序接口

热门文章

  1. 对于程序员来说养成规范的打字真的很重要
  2. ffmpeg使用硬件加速hwaccel、cuvid、h264_cuvid、h264_nvenc
  3. html打开方式解锁,解锁bootloader
  4. 服务器ftp文件不能共享文件夹权限,ftp服务器共享文件夹权限设置
  5. Excel VBA:设置图表系列格式
  6. 移动200/300M网速只有最高5M/s(3G太快了),提高网速的办法和具体处理方式
  7. 初探 ModBus4j -简单使用指南
  8. log4j输出多个自定义日志文件、动态配置多个日志文件
  9. 达梦数据库 ,无效的列名, org.springframework.dao.DataIntegrityViolationException: Hibernate-related JDBC operat
  10. Java应用编程_常用类库汇总2(日期类正则表达式国际化程序)