文件操作
文件在程序中是以流的形式来操作的
- 输入流:读文件 - 文件 -》 Go程序(内存)
- 输出流:写文件 - Go程序(内存)-》文件
os.File 结构体, 封装了文件的所有操作
文件操作
- os.Open 打开文件,返回一个File类型的指针*File
- os.Close关闭文件
- 读取文件(带缓冲区的方式) reader := bufio.NewReader(file) - 适合大文件
- 读取整个文件 ioutil.ReadFile, 返回字节数组,需要转成string - 没有显示的Open,所以也不需要Close
- 写文件 OpenFile(name string, flag int, perm FileMode)
filePath := "abc.txt" file,err := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE, 0666) if err != nil { fmt.Println("write file err: ", err) } defer file.Close() str := "Hello Gardon!\n" writer := bufio.NewWriter(file) for i := 0;i< 5;i++{ writer.WriteString(str) } // 因为writer带缓存,先写入buffer中,需要flush写入到磁盘上 writer.Flush()
- ioutil.ReadFile 和 iotutil.WriteFile
- 判断文件是否存在 os.Stat()
- nil, 文件存在
- os.IsNotxist(err) 返回true则不存在
- other err 不确定错误,直接返回false和err
- 拷贝文件
- io.Copy()
命令行参数
- os.Args 一个string切片
- 使用flag包来解析命令行参数
var user string var password string var host string var port int flag.StringVar(&user, "u", "", "用户名,默认为空") flag.StringVar(&password, "pwd", "", "密码,默认为空") flag.StringVar(&host, "h", "localhost", "主机名,默认为localhost") flag.IntVar(&port, "p", 3306, "端口名,默认为3306") // 解析flag flag.Parse() // 输出结果 fmt.Printf("user=%v,pwd=%v,host=%v,port=%v", user, password, host, port)
Json相关
Json -》 序列化 -》Json字符串 -》网络传输 -》 程序 -》 反序列化 -》 其他语言
Json序列化
- key值必须大写,否则序列化失败
json.Marshal(interface{})
- 可以添加tag指定key的命名
`json:` // 反射机制
Json反序列化
- 将json字符串转换成要求的数据结构
json.Unmarshal([]byte, interface{})
- 反序列化时不需要make操作,已经没封装到了Unmarshal()中
单元测试 Unit Test
- 传统方法在main函数中调用被测函数
- 不方便,需要修改主函数代码,无法测试正在运行的项目代码
- 不利于管理,如果需要测试大量函数,需要重写大量代码
- 单元测试 -》 testing 测试框架
- go test实现单元测试和性能测试
- 保证代码质量
- 提供代码性能
Testing框架
- 将xxx_test.go引入main(){}
- 调用Test开头的函数
- 传参类型必须是*testing.T
- 测试指令
- go test (运行正确,无日志;错误则输出日志)
- go test -v (无论正确错误都输出日志)
- 当出现错误时,
t.Fatalf()
格式化输出错误信息 并退出程序 - 测试单个方法
go test -v test.run TestXXXX
import("testing") // 引入testing测试框架
func TestXXX(*testing.T){}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!