乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

    • Golang基础知识

      • 开发环境搭建
      • 常量与变量
      • 基本数据类型
      • 复合数据类型
      • 流程控制
      • 运算符
      • 位运算符详解
      • 指针
      • map
      • 函数
      • defer
      • 类型别名与自定义类型
      • 结构体
      • 接口
      • 包
      • 文件操作
        • 打开和关闭文件
        • 读取文件
          • file.read()
          • bufio 读取文件
          • ioutil 读取整个文件
        • 写入文件
          • Write 和 WriteString
          • bufio 写入文件
          • ioutil 写入文件
        • 日志库
          • 需求
      • 反射
      • 并发
      • socket网络编程
      • HTTP网络编程
      • 单元测试
      • 基准测试
      • 并发测试
      • 示例函数
      • 性能优化
      • go module
      • 在Go中使用Makefile
      • 部署Go项目
    • Golang进阶知识

    • Golang常用包

  • AIOps

  • 专栏
  • Golang
  • Golang基础知识
乔克
2025-07-13
目录

文件操作

# 打开和关闭文件

在 Go 语言中使用os.Open()可以打开一个文件,返回一个文件指针*file和错误信息err,对得到的文件指针调用close()方法即可关闭文件。

如下:

package main

import (
	"fmt"
	"os"
)

func main() {
	file, _ := os.Open("./main.go")
	fmt.Printf("%T\n", file)
	file.Close()
}
1
2
3
4
5
6
7
8
9
10
11
12

为了防止文件忘记关闭,我们通常使用 defer 注册文件关闭语句。

如下:

package main

import (
	"fmt"
	"os"
)

func main() {
	file, _ := os.Open("./main.go")
	fmt.Printf("%T\n", file)
	defer file.Close()
}
1
2
3
4
5
6
7
8
9
10
11
12

# 读取文件

# file.read()

read方法定义如下:

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

该方法接受一个字节类型的参数,返回读取的字节数和可能的错误,读到文件末尾会返回0和io.EOF。

如下:

package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("./main.go")
	if err != nil {
		fmt.Printf("File Open failed.err:%s\n", err)
		return
	}
	defer file.Close()
	// 定义读取的字节数
	tmp := make([]byte, 128)
	// 按字节读取文件
	n, err := file.Read(tmp)
	if err != nil {
		fmt.Printf("File Read Failed.err:%s\n", err)
		return
	}
	// 打印读取的字节数
	fmt.Println(n)
	// 打印读取的内容
	fmt.Println(string(tmp[:n]))
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

上面这种读取方式是按设定的字节读取,如果文本中总字节数少于设定的,那么就可以把文本全部读取出来,如果文本总字节数大于设定的字节数,那么文本就不能被全部读取。

这个时候可以使用循环来读取所有文本,如下:

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	file, err := os.Open("./main.go")
	if err != nil {
		fmt.Printf("File Open failed.err:%s\n", err)
		return
	}
	defer file.Close()
	// 定义读取的字节数
	tmp := make([]byte, 128)
	for {
		// 按字节读取文件
		n, err := file.Read(tmp)
		// 如果文件已经读完了,就退出
		if err == io.EOF {
			// fmt.Printf("文件读完了\n")
			break
		}
		if err != nil {
			fmt.Printf("File Read Failed.err:%s\n", err)
			return
		}
		// 打印读取的内容
		fmt.Print(string(tmp[:n]))
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# bufio 读取文件

bufio是带缓存功能的 I/O 操作。用其读取文件的示例如下:

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	// 打开文件
	file, err := os.Open("./main.go")
	if err != nil {
		fmt.Printf("Open File Failed.err:%s\n", err)
		return
	}
	defer file.Close()
	// 返回一个新的reader,用NewReader有默认大小
	reader := bufio.NewReader(file)
	// 用循环逐行读取文件
	for {
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			// fmt.Printf("File Has Been Read\n")
			break
		}
		if err != nil {
			fmt.Printf("Read File Failed.err:%s\n", err)
		}
		fmt.Print(line)
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

上面是用的bufio.NerReader()来获取一个新的reader,再用这个对象来读取文件的。除此之外还可以使用bufio.NewReaderSize来获取一个新的reader,不同之处在于NewReaderSize可以设置缓冲区的大小,语法如下:

reader := bufio.NewReaderSize(fileObj, size)
1

# ioutil 读取整个文件

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

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	content, err := ioutil.ReadFile("./main.go")
	if err != nil {
		fmt.Printf("Read File Failed.err:%s\n", err)
		return
	}
	fmt.Println(string(content))
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 写入文件

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

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
	...
}
1
2
3

其中:

name:要打开的文件名 flag:打开文件的模式。 模式有以下几种:

含义 模式
只写 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。

比如:

file,err := os.OpenFile("xx.txtx",os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
1

# Write 和 WriteString

Write写入的是字节切片数据,WriteString写入的是字符串数据。

如下:

package main

import (
	"fmt"
	"os"
)

func main() {
	file, err := os.OpenFile("a.txt", os.O_APPEND|os.O_CREATE, 0644)
	if err != nil {
		fmt.Printf("Open File Failed.err:%s\n", err)
		return
	}
	defer file.Close()
	// 写入
	str := "牛逼的Go语言\n"
	// 用Write写入
	file.Write([]byte(str))
	// 用WriteString写入
	file.WriteString(str)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# bufio 写入文件

使用bufio.NewWriter()写入文件,需要在最后Flush()。

如下:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	file, err := os.OpenFile("b.txt", os.O_APPEND|os.O_CREATE, 0644)
	if err != nil {
		fmt.Printf("Open File Failed.err:%s\n", err)
		return
	}
	defer file.Close()
	// 用bufio.NewWrite返回一个writer
	writer := bufio.NewWriter(file)
	writer.WriteString("这是一个bufio的写入测试")
	writer.Flush()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

同理除了使用NewWriter,还可以使用NewWriterSize。

# ioutil 写入文件

前面介绍ioutil.ReadFile可以读取整个文件,另外ioutil.WriterFile也可以一次性将内容写入文件。

语法如下:

err := ioutil.WriterFile("xxx.txt", []byte(str), 0644)
1

如下:

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	str := `
	融融的三月,万物尽苏醒

	蜿蜒曲折的小路承载着儿时的记忆

	鸟儿在树梢吟唱,歌颂着新春好光景

	阳光明媚,和着泥土和花香

	舒展手臂抱向天空,拥抱朵朵云彩

	大地又重新充满了生机。
	`
	err := ioutil.WriteFile("./c.txt", []byte(str), 0644)
	if err != nil {
		fmt.Printf("Write File Failed.err:%s\n", err)
		return
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 日志库

# 需求

  • 支持往不同地方写日志
  • 日志分级别
    • Debug
    • Trace
    • Info
    • Warning
    • Error
    • Fatal
  • 日志支持开关控制
  • 日志记录包含时间、行号、文件名、日志级别、日志信息
  • 日志文件要切割
    • 按大小切割
    • 按时间切割
上次更新: 2025/07/18, 11:04:43
包
反射

← 包 反射→

最近更新
01
2025年,SRE在企业中可以做哪些事
07-18
02
SRE 如何提升自己在团队中的影响力
07-18
03
使用Go开发MCP服务
07-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式