一、文件操作
文件是数据源(保持数据的地方)的一种,比如大家经常使用的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 综合测试用例