Go语言学习笔记part5

文件操作

打开和关闭文件

os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. )
  6. func main() {
  7. // 只读方式打开当前目录下的main.go文件
  8. file, err := os.Open("./main.go")
  9. if err != nil {
  10. fmt.Println("open file failed!, err:", err)
  11. return
  12. }
  13. // 关闭文件
  14. file.Close()
  15. }

读取文件

file.Read()

Read方法定义如下:

  1. func (f *File) Read(b []byte) (n int, err error)

它接收一个字节切片,返回读取的字节数和可能的具体错误,读到文件末尾时会返回0io.EOF

bufio()

bufio是在file的基础上封装了一层API,支持更多的功能。

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os"
  7. )
  8. // bufio按行读取示例
  9. func main() {
  10. file, err := os.Open("./xx.txt")
  11. if err != nil {
  12. fmt.Println("open file failed, err:", err)
  13. return
  14. }
  15. defer file.Close()
  16. reader := bufio.NewReader(file)
  17. for {
  18. line, err := reader.ReadString('\n') //注意是字符
  19. if err == io.EOF {
  20. if len(line) != 0 {
  21. fmt.Println(line)
  22. }
  23. fmt.Println("文件读完了")
  24. break
  25. }
  26. if err != nil {
  27. fmt.Println("read file failed, err:", err)
  28. return
  29. }
  30. fmt.Print(line)
  31. }
  32. }

ioutil()

io/ioutil包的ReadFile方法能够读取完整的文件,只需要将文件名作为参数传入。

  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. )
  6. // ioutil.ReadFile读取整个文件
  7. func main() {
  8. content, err := ioutil.ReadFile("./main.go")
  9. if err != nil {
  10. fmt.Println("read file failed, err:", err)
  11. return
  12. }
  13. fmt.Println(string(content))
  14. }

文件写入

os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。

  1. func OpenFile(name string, flag int, perm FileMode) (*File, error) {
  2. ...
  3. }
模式 含义
os.O_WRONLY 只写
os.O_CREATE 创建文件
os.O_RDONLY 只读
os.O_RDWR 读写
os.O_TRUNC 清空
os.O_APPEND 追加

perm:文件权限,一个八进制数。r(读)04,w(写)02,x(执行)01。

Write()和WriteString()

  1. func main() {
  2. file, err := os.OpenFile("xx.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
  3. if err != nil {
  4. fmt.Println("open file failed, err:", err)
  5. return
  6. }
  7. defer file.Close()
  8. str := "hello 沙河"
  9. file.Write([]byte(str)) //写入字节切片数据
  10. file.WriteString("hello 小王子") //直接写入字符串数据
  11. }

ioutil.WriteFile()

  1. func main() {
  2. str := "hello 沙河"
  3. err := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
  4. if err != nil {
  5. fmt.Println("write file failed, err:", err)
  6. return
  7. }
  8. }

日志库

需求分析

  1. 支持往不同的地方输出日志

  2. 日志分级别
    (1) Trace
    (2) Debug
    (3) Info
    (4) Warning
    (5) Error
    (6) Fatal

  3. 日志要支持开关

  4. 完整的日志记录要包含时间、行号、文件名、日志级别、日志信息

  5. 日志文件要切割

  6. 日志可以支持格式化输出
    (1)按文件大小切割:每次记录之前判断以下文件大小,如果达到最大值就写新文件
    (2)按日期切割

  7. 异步方式写日志,提升性能

设计思路

项目地址

传送门