Golang学习之---文件流、json与testing单元测试(七)

一、文件操作

文件是数据源(保持数据的地方)的一种,比如大家经常使用的word文档、txt文档、excel文档,包括数据库数据也是一种文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保存视频,声音等...
file的叫法:1、file文件对象 2、file文件指针 3、文件句柄。文件返回的都是*file,所以说文件是一个指针类型
数据库也是一种文件。以程序的角度判断输入流(读)、输出流(写)。

1.1 输入流和输出流

1.2 os.File封装所有文件相关操作,File是一个结构体
后面操作文件,会经常使用到os.File结构体 import os

1.3 基本操作 -- 打开文件和关闭文件


1.4 读文件操作应用实例

有两种方式,区别是:是否可以一次性的把文件读取到内存中
①对于大文件:使用带有缓冲区的读取 import ("os" "bufio" "io")
②适用于文件不太大的情况,可以把文件一次性读取到内存中 import ("io/ioutil")
方式一:

方式二:

1.5 写文件操作应用实例

有两种方式
①带缓冲区的写入数据(大文件和小文件都可以) import ("os" "bufio")
②对于文件不太大的情况。如:将一个文件的内容写入到另一个文件中 import ("io/ioutil")
1.5.1 方法一:先介绍介绍 os.OpenFile函数,参数参考 os.Constants


参数三:perm FileModel只针对Linux或Unix系统生效。对Windows无效,一般给 定值 0666
r-4 w-2 x-1

参数二 flag int:
const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)

1.5.2 方法一:使用

1.5.3 方法二:使用

1.6 判断文件是否存在

1.7 拷贝文件

  • 拷贝文件: 有三种方法     
  • 方法一:使用系统自带的io.Copy函数:func Copy(dst Writer, src Reader) (written int64, err error):将src的数据拷贝到dst 
  • 方法二:使用io/ioutil先读取文件到内存中,再写入     
  • 方法三:使用bufio先读取文件到内存中,再写入
  • 图片/电影/mp3 都是二进制文件,同样的方法 进行拷贝

1.8 文件编程应用实例-- 统计英文、数字、空格和其他字符数量 
...

二、解析命令行参数

如果我们希望能够获取到命令行输入的各种参数,如:test.exe -u root -pwd root -h localhost -port 3306 应该怎么做?-》使用命令行参数。go run argsTest1.go 1 2 3 4

1、使用原生方式获取 os.Args

os.Args是一个string的切片,用来存储所有的命令行参数

2、使用flag包获取

前面的方式是比较原生的方式,对解析参数不是特别的方便,特别是带有指定参数形式的命令行。如:test.exe -u root -pwd root -h localhost -port 3306 这样的。Go设计者为我们提供了flag包可以很方便的解析命令行参数,且参数顺序可随意。

三、JSON的基本介绍

服务器要给浏览器传输数据,比如数组/结构体/map等,往往不会直接传输,而是要把它转成一个json字符串。json格式利于网络传输,所以,网络传输时往往用json格式。json的格式说明:{ : } 、数组用[]
3.1 概述

3.2 应用场景(示意图)

3.3 Json数据格式说明

3.4 Json数据在线解析网址:https://www.json.cn/

3.5 Json的序列化:数据类型(常用结构体、map、切片)-》json串

json序列化是指,将key-value结构的数据类型(如:结构体、map、切片)序列化成json字符串的操作。
注意:基本数据类型也可以序列化但没什么意义,一般是将key-value的数据类型序列化。
import "encoding/json"

3.5.1 tag知识点

结构体的序列化注意:如①字段是首字母大写,而我们希望在json串中都是小写;②想要自定义序列化后key的名字,可以给结构体字段指定一个tag标签。使用了反射机制,后面会讲到。

3.6 Json的反序列化:json串-》数据类型(常用结构体、map、切片)

json反序列化是指,将json字符串反序列化成对应的数据类型(如:结构体、map、切片)的操作。
说明:
①在反序列化一个json串时,要确保发序列化后的数据格式和序列化前的数据格式一致
②对结构体来说:json串中的key结构体字段对比,在反序列化时不区分大小写
③对结构体来说:结构体字段有tag的根据tag名字来反序列化(同样不区分大小写)

四、单元测试

传统的测试方法:main()函数测试。缺点:①如果项目在运行,就可能需要去停止项目;②不利于管理,main里面可以写多个测试函数或模块,太混乱。
4.1 基本介绍

Go语言中自带一个轻量级的测试框架testing自带go test命令来实现单元测试性能测试。和其他语言的测试框架类似。可以基于这个框架来写针对相应函数的测试用例,也可以基于该框架来写相应的压力测试用例。通过单元测试,可以解决如下问题:
① 确保每个函数是可运行的,并且运行结果是正确的。
② 确保写出来的代码性能是好的。
单元测试能及时的发现程序设计或实现上的逻辑错误,使问题及早暴露,便于问题的定位解决;而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还可以保持稳定。性能测试,一个很重要的因素:时间
测试历程,就是测试用例(一般台湾人说历程)

4.2 测试示例

4.3 运行原理示意图

4.4 单元测试总结

  • ①测试用例文件名必须以_test.go结尾;
  • ②测试用例必须以TestXxx开头,一般是以Test+被测试的函数名,比如TestAddUpper
  • ③TestAddUpper(t *testing.T) 的形参必须是 *testing.T
  • ④一个测试用例文件中,可以有多个测试用例函数,比如:TestAddUpper、TestHello
  • ⑤运行 测试用例 指令:
    cmd>go test [如果运行正确,无日志;错误时会输出日志]
    cmd>go test -v [运行正确或错误,都会输出日志]
  • ⑥当出现错误时,使用t.Fatalf来格式化输出错误信息并退出程序
  • ⑦t.Logf 方法可以输出相应的日志
  • ⑧PASS表示测试用例运行成功。FAIL表示测试用例运行失败
  • ⑨测试单个文件,加上被测试的原文件名
    cmd>go test -v add_test.go calculation.go
  • ⑩测试单个方法
    cmd>go test -v -test.run TestXxxx
  • 11、加载testing框架本身也需要时间。fmt也还挺费时间的。

4.5 综合测试用例

猜你喜欢

转载自blog.csdn.net/qq_37358143/article/details/107675579