Go os包
Go标准库os提供与操作系统交互的接口。
文件操作
创建文件
Go
import "os"
// 创建文件
file, err := os.Create("test.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// Create会覆盖已存在的文件
打开文件
Go
// 只读打开
file, err := os.Open("test.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 指定模式打开
file, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE, 0644)
OpenFile模式常量
| 常量 | 含义 |
|---|---|
| O_RDONLY | 只读 |
| O_WRONLY | 只写 |
| O_RDWR | 读写 |
| O_CREATE | 创建(不存在时) |
| O_APPEND | 追加 |
| O_TRUNC | 清空文件 |
| O_EXCL | 独占创建 |
读写文件
Go
// 写入
file.Write([]byte("hello"))
file.WriteString("world")
// 读取
buf := make([]byte, 100)
n, _ := file.Read(buf)
fmt.Println(buf[:n])
// 按位置读取
n, _ := file.ReadAt(buf, 0)
ReadFile/WriteFile
Go
// 一次性读取文件
data, err := os.ReadFile("test.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(data))
// 一次性写入文件
err := os.WriteFile("test.txt", []byte("hello"), 0644)
ReadFile和WriteFile是简化操作,适合小文件。
文件信息
Stat获取信息
Go
info, err := os.Stat("test.txt")
if err != nil {
log.Fatal(err)
}
fmt.Println(info.Name()) // 文件名
fmt.Println(info.Size()) // 文件大小
fmt.Println(info.Mode()) // 文件模式
fmt.Println(info.ModTime()) // 修改时间
fmt.Println(info.IsDir()) // 是否目录
IsNotExist判断
Go
if os.IsNotExist(err) {
fmt.Println("文件不存在")
}
if os.IsExist(err) {
fmt.Println("文件已存在")
}
目录操作
创建目录
Go
// 创建单层目录
os.Mkdir("dir1", 0755)
// 创建多层目录
os.MkdirAll("dir1/dir2/dir3", 0755)
// MkdirAll自动创建所有层级
读取目录
Go
// 读取目录内容
entries, _ := os.ReadDir(".")
for _, entry := entries {
fmt.Println(entry.Name(), entry.IsDir())
}
删除目录
Go
// 删除空目录
os.Remove("dir1")
// 删除目录及内容
os.RemoveAll("dir1") // 删除所有内容
// RemoveAll递归删除
文件删除与重命名
Remove函数
Go
// 删除文件
os.Remove("test.txt")
// 删除空目录
os.Remove("empty_dir")
Rename函数
Go
// 重命名文件
os.Rename("old.txt", "new.txt")
// 移动文件
os.Rename("file.txt", "dir/file.txt")
环境变量
读取环境变量
Go
// 读取变量
path := os.Getenv("PATH")
// 安全读取(区分不存在)
val, exists := os.LookupEnv("MY_VAR")
if !exists {
fmt.Println("不存在")
}
设置环境变量
Go
// 设置变量
os.Setenv("MY_VAR", "value")
// 删除变量
os.Unsetenv("MY_VAR")
// 清除所有变量
os.Clearenv()
// 获取所有变量
envs := os.Environ() // []string
进程信息
os.Args
Go
// 命令行参数
fmt.Println(os.Args) // 所有参数
fmt.Println(os.Args[0]) // 程序名
fmt.Println(os.Args[1:]) // 参数列表
进程ID
Go
// 当前进程ID
pid := os.Getpid()
// 父进程ID
ppid := os.Getppid()
// 当前用户ID
uid := os.Getuid()
// 当前组ID
gid := os.Getgid()
工作目录
Go
// 获取工作目录
dir, _ := os.Getwd()
// 改变工作目录
os.Chdir("/tmp")
进程控制
os.Exit
Go
// 立即退出进程
os.Exit(0) // 正常退出
os.Exit(1) // 异常退出
// Exit不会执行defer
执行命令
Go
import "os/exec"
cmd := exec.Command("ls", "-la")
output, _ := cmd.Output()
fmt.Println(output)
cmd.Run() // 执行不获取输出
cmd.Start() // 启动进程
cmd.Wait() // 等待完成
用户和主机信息
Go
// 获取主机名
hostname, _ := os.Hostname()
// 获取当前用户
user, _ := user.Current()
fmt.Println(user.Username)
fmt.Println(user.HomeDir)
文件权限
权限模式
Go
// 权限位
0644 // 用户读写,组读,其他读
0755 // 用户读写执行,组读执行,其他读执行
0777 // 全权限
0600 // 仅用户读写
chmod修改权限
Go
// 修改权限
os.Chmod("test.txt", 0644)
// Unix/Linux权限表示
临时文件
os.TempDir
Go
// 获取临时目录
tempDir := os.TempDir()
// 创建临时文件
file, _ := os.CreateTemp("", "prefix-*.txt")
defer os.Remove(file.Name())
// 创建临时目录
dir, _ := os.MkdirTemp("", "prefix-")
defer os.RemoveAll(dir)
标准输入输出
Go
// 标准输入
os.Stdin
// 标准输出
os.Stdout
// 标准错误
os.Stderr
// 使用
fmt.Fprintln(os.Stdout, "hello")
fmt.Fprintln(os.Stderr, "error")
常用函数表
| 函数 | 用途 | 返回值 |
|---|---|---|
| Create | 创建文件 | File, err |
| Open | 打开文件 | File, err |
| OpenFile | 指定模式打开 | File, err |
| ReadFile | 读取全部 | []byte, err |
| WriteFile | 写入全部 | err |
| Stat | 文件信息 | FileInfo, err |
| Mkdir | 创建目录 | err |
| MkdirAll | 创建多层目录 | err |
| Remove | 删除 | err |
| RemoveAll | 递归删除 | err |
| Rename | 重命名 | err |
| Getenv | 获取环境变量 | string |
| LookupEnv | 安全获取 | string, bool |
| Getwd | 工作目录 | string, err |
| Getpid | 进程ID | int |
| Exit | 退出进程 | 无 |
要点总结
- Create创建文件,Open只读打开
- OpenFile指定读写模式
- ReadFile/WriteFile一次性读写
- Stat获取文件信息
- Mkdir创建单层,MkdirAll创建多层
- Remove删除单个,RemoveAll递归删除
- Getenv读取环境变量,LookupEnv区分不存在
- os.Args获取命令行参数
- Getpid/Getppid获取进程ID
- os.Exit立即退出进程
- os.Stdin/Stdout/Stderr标准输入输出
- TempDir/CreateTemp处理临时文件
📝 发现内容有误?点击此处直接编辑