必须先将整数转为字符串再转[]byte,因os.writefile只接受字节切片;错误做法是直接传int或误用string(int)导致unicode乱码,正确方式是strconv.itoa(n)或fmt.sprintf("%d", n)后强转。

用 ioutil.WriteFile 写入整数需要先转成字符串或字节
Go 的 ioutil.WriteFile(在 Go 1.16+ 中已移至 os.WriteFile)只接受 []byte,不能直接写 int。常见错误是直接传 int 导致编译失败:cannot use n (type int) as type []byte in argument to os.WriteFile。
最简做法是用 fmt.Sprintf 或 strconv.Itoa 转成字符串,再用 []byte() 转换:
num := 42
data := []byte(strconv.Itoa(num))
os.WriteFile("num.txt", data, 0644)
- 如果要带换行,加
\n:[]byte(strconv.Itoa(num) + "\n") - 多位整数或需格式控制(如补零、十六进制),用
fmt.Sprintf("%08d", num) -
os.WriteFile会覆盖整个文件,不是追加
追加整数到文件要用 os.OpenFile 配合 Write
想在文件末尾添加数字(比如日志计数器),不能用 os.WriteFile,得打开文件并设置 os.O_APPEND | os.O_WRONLY | os.O_CREATE 标志。
f, err := os.OpenFile("log.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
log.Fatal(err)
}
defer f.Close()
_, _ = f.Write([]byte(strconv.Itoa(123) + "\n"))
- 漏掉
os.O_WRONLY会导致invalid argument错误 - 没调用
defer f.Close()可能造成句柄泄漏,尤其循环写入时 - 如果写入频率高,建议用
bufio.Writer包一层提升性能
写二进制整数(如 int32)要用 binary.Write
如果目标是存原始字节(例如和 C 程序交互、节省空间),别用字符串,改用 encoding/binary:
f, _ := os.Create("num.bin")
defer f.Close()
binary.Write(f, binary.LittleEndian, int32(42))
- 必须指定字节序:
binary.LittleEndian或binary.BigEndian,否则读取时会错乱 - 类型要显式匹配,
int在不同平台长度不固定,推荐用int32/int64 - 该方式写入的文件不能用
cat直接看,是不可读的二进制流
注意文件权限和错误处理的实际影响
权限掩码 0644 在 Windows 下会被忽略,但在 Linux/macOS 上决定谁可读写。更关键的是:不检查 error 返回值,程序可能静默失败。
- 磁盘满、目录不存在、无写权限时,
os.WriteFile返回非nilerror,但很多人直接忽略 - 权限设成
0777并不意味着“所有人都能执行”,只是按系统 umask 截断后生效 - 临时目录下写文件,建议用
os.TempDir()+os.CreateTemp避免路径硬编码
整数写文件本身很简单,真正容易出问题的是类型转换的隐式假设、权限与错误处理的遗漏,以及二进制/文本场景混淆。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











