文件操作

  • 文件在程序中是以流的形式来操作的

    • 输入流:读文件 - 文件 -》 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 协议 ,转载请注明出处!

Go的并发编程 上一篇
Project Design 下一篇