[TOC]
# 函數
## 目錄相關
```go
// 創建單級目錄
func testMkdir() {
if err := os.Mkdir("test", 0775); err != nil {
panic(err)
}
}
// 創建多級目錄
func testMkdirAll() {
if err := os.MkdirAll("test/a/b", 0775); err != nil {
panic(err)
}
}
// 創建臨時目錄
// centos默認10天后清理臨時目錄,配置/usr/lib/tmpfiles.d/tmp.conf
func testMkdirTemp() {
// 創建一個以 `test_` 開頭的臨時目錄
if s, err := os.MkdirTemp("", "test_"); err != nil {
panic(err)
} else {
fmt.Println(s)
}
}
// 刪除空文件夾
func testRemove() {
if err := os.Remove("test/a/b"); err != nil {
panic(err)
}
}
// 遞歸刪除文件夾
func testRemoveAll() {
if err := os.RemoveAll("test"); err != nil {
panic(err)
}
}
// 查看臨時目錄
func testTempDir() {
s := os.TempDir()
fmt.Printf("temp dir: %v\n", s)
}
// 查看用戶家目錄
func testUserHomeDir() {
if s, err := os.UserHomeDir(); err != nil {
panic(err)
} else {
fmt.Printf("Home dir: %v\n", s)
}
}
// 查看用戶緩存目錄
func testUserCacheDir() {
if s, err := os.UserCacheDir(); err != nil {
panic(err)
} else {
fmt.Printf("cache dir: %v\n", s)
}
}
// 查看用戶配置目錄
func testUserConfigDir() {
if s, err := os.UserConfigDir(); err != nil {
panic(err)
} else {
fmt.Printf("config dir: %v\n", s)
}
}
```
## 移動和修改名字
Rename 可以用作剪切(移動mv)功能、及重命名。適用于文件及目錄
```go
func testRename() {
if err := os.Rename("test.txt", "/tmp/test.txt"); err != nil {
panic(err)
}
}
```
## 工作目錄
```go
// 查看當前工作目錄
func testGetwd() {
if dir, err := os.Getwd(); err != nil {
panic(err)
} else {
fmt.Printf("dir is %v\n", dir)
}
}
// 切換工作目錄
func testChdir() {
if err := os.Chdir("./11.socket"); err != nil {
panic(err)
}
dir, _ := os.Getwd()
fmt.Printf("dir is %v\n", dir)
}
```
## 修改權限
```go
func testChmod() {
if err := os.Chmod("test", 0777); err != nil {
panic(err)
}
}
```
## 用戶ID、租戶ID
```go
func testUserGroup() {
// 當前用戶id和租戶id
fmt.Printf("userID: %v, groupID: %v\n", os.Getgid(), os.Getuid())
// 調用者用戶id和租戶id
fmt.Printf("caller userID: %v, groupID: %v\n", os.Geteuid(), os.Getegid())
}
// Getgroups 返回調用者所屬組的數字 ID 列表。
func testGetgroups() {
s, err := os.Getgroups()
if err != nil {
panic(err)
}
fmt.Println(s)
}
```
## pid/ppid
```go
func testPid() {
fmt.Printf("pid: %v, ppid: %v\n", os.Getpid(), os.Getppid())
}
```
## 軟鏈接
```go
func testSymlink() {
if err := os.Symlink("./test", "./test_link"); err != nil {
panic(err)
}
}
```
## 環境變量
這個做的環境只影響程序,不影響主機層面的配置
```go
// 獲取環境變量
func testEnviron() {
s := os.Environ()
fmt.Printf("environ is: %v\n", s)
}
// 清理環境變量
func testClearenv() {
os.Clearenv()
}
func testSetenv() {
// 添加環境變量
if err := os.Setenv("name", "jiaxzeng"); err != nil {
panic(err)
}
// 獲取單個環境變量
s := os.Getenv("name")
fmt.Printf("env is name: %v\n", s)
// 刪除環境變量
if err := os.Unsetenv("name"); err != nil {
panic(err)
}
}
```
## 退出程序
```go
func testExit() {
os.Exit(1)
}
```
## 獲取主機名
```go
func testHostname() {
// 方法一
name, err := os.Hostname()
if err != nil {
panic(err)
}
fmt.Printf("hostname is: %v\n", name)
// 方法二
name = os.Getenv("HOSTNAME")
fmt.Printf("hostname is: %v\n", name)
}
```
## 判斷錯誤類型
```go
func testError() {
fmt.Println("-----------IsExist-----------------")
err := os.Mkdir("test", 0775)
if os.IsExist(err) {
fmt.Println("dir is exists...")
}
fmt.Println("\n-----------IsNotExist-----------------")
err = os.Chdir("/xxx")
if os.IsNotExist(err) {
fmt.Println("dir not exists...")
}
fmt.Println("\n-----------IsPermission-----------------")
de, err := os.ReadDir("/opt/hislog/root")
if os.IsPermission(err) {
fmt.Println("Permission denied...")
}
for _, d := range de {
fmt.Printf("Name: %s, isdir: %T\n", d.Name(), d.IsDir())
}
fmt.Println("\n-----------IsTimeout-----------------")
fmt.Println("\n-----------IsPathSeparator-----------------")
n, _ := strconv.Atoi(fmt.Sprintf("%d", '/'))
if os.IsPathSeparator(uint8(n)) {
fmt.Println("path separator: /")
} else {
fmt.Println("path separator: \\")
}
}
// 運行結果
// -----------IsExist-----------------
// dir is exists...
// -----------IsNotExist-----------------
// dir not exists...
// -----------IsPermission-----------------
// Permission denied...
// -----------IsTimeout-----------------
// -----------IsPathSeparator-----------------
// path separator: /
```
# File 結構體
## 創建文件句柄
```go
func testFileCreate() {
// 創建文件
// 文件存在且內容不為空,清空里面的內容
f, err := os.Create("test.txt")
if err != nil {
panic(err)
}
f.Close()
// 創建臨時文件
f2, err2 := os.CreateTemp("", "test_")
if err2 != nil {
panic(err2)
}
defer os.Remove(f2.Name())
f2.Close()
// 打開文件
f3, err3 := os.Open("test.txt")
if err3 != nil {
panic(err3)
}
f3.Close()
// 打開文件【推薦】
// 不存在創建,文件可讀寫,存在追加內容,設置文件的權限
f4, err4 := os.OpenFile("test.conf", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644)
if err4 != nil {
panic(err4)
}
f4.Close()
}
```
## 關閉文件句柄
通常使用延遲關閉文件的
```go
f, err := os.OpenFile("test.conf", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644)
if err != nil {
panic(err)
}
defer f.Close()
```
## 讀寫文件
```go
// 讀文件
func testFileRead() {
f, err := os.OpenFile("test.txt", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644)
if err != nil {
panic(err)
}
defer f.Close()
fmt.Println("filename", f.Name(), "context: ")
buf := make([]byte, 5)
for {
n, err := f.Read(buf)
if err == io.EOF {
break
}
fmt.Print(string(buf[:n]))
}
}
// 寫文件
func testFileWrite() {
f, err := os.OpenFile("test.txt", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0644)
if err != nil {
panic(err)
}
defer f.Close()
// 按照字節方式寫入
_, err = f.Write([]byte("xiaodunan\n"))
if err != nil {
panic(err)
}
// 按照字符串方式寫入
_, err = f.WriteString("jiaxzeng\n")
if err != nil {
panic(err)
}
}
```
# Process 結構體
## kill
```go
func testNewProcess() {
p, err := os.FindProcess(os.Getpid())
if err != nil {
panic(err)
}
fmt.Println("pid :", p.Pid)
p.Kill()
fmt.Println("11111")
}
// 運行結果
// pid : 127782
// signal: killed
```
# os/exec
## 只執行命令,不獲取結果
```go
func testExecRun(command string) {
err := exec.Command("/bin/sh", "-c", command).Run()
if err != nil {
panic(err)
}
}
func main() {
cmd := `ls`
testExecRun(cmd)
}
```
## 執行命令,且獲取結果
```go
func testExecOutput(cmd string) {
out, err := exec.Command("/bin/sh", "-c", cmd).Output()
if err != nil {
panic(err)
}
if string(out) != "" {
fmt.Println(string(out))
}
}
func main() {
cmd1 := `ls`
cmd2 := `systemctl stop firewalld`
testExecOutput(cmd1)
fmt.Println("----------------------------")
testExecOutput(cmd2)
}
// 10.concurrency
// 11.socket
// 1.basicDataType
// 2.operator
// 3.flowControlStatement
// 4.advancedDataType
// 5.function
// 6.builtInFunc
// 7.fileOperations
// 8.struct
// 9.interface
// ----------------------------
// panic: exit status 1
// goroutine 1 [running]:
// main.testExecOutput({0x4b8ad9?, 0xc0000021a0?})
// /data/code/src/code.jiaxzeng.com/backend/study/6.builtInFunc/builtOS.go:276 +0xd9
// main.main()
// /data/code/src/code.jiaxzeng.com/backend/study/6.builtInFunc/builtOS.go:347 +0x36
// exit status 2
```
## 執行命令,并區分stdout 和 stderr
```go
func testExecRunOutErr(command string) {
var stdout, stderr bytes.Buffer
cmd := exec.Command("/bin/sh", "-c", command)
cmd.Stdout = &stdout // 標準輸出
cmd.Stderr = &stderr // 標準錯誤
cmd.Run()
if stderr.String() != "" {
fmt.Printf("command: %#v, Error: %v", command, stderr.String())
} else if stdout.String() != "" {
fmt.Println(stdout.String())
}
}
func main() {
cmd := `systemctl stop firewalld`
testExecRunOutErr(cmd)
}
// command: "systemctl stop firewalld", Error: Failed to stop firewalld.service: Interactive authentication required.
// See system logs and 'systemctl status firewalld.service' for details.
```
## 執行管道符命令
```go
func testExecStdoutPipe() {
c1 := exec.Command("ls")
c2 := exec.Command("wc", "-l")
c2.Stdin, _ = c1.StdoutPipe()
c2.Stdout = os.Stdout
c2.Start()
c1.Run()
c2.Wait()
}
func main() {
testExecStdoutPipe()
}
// 11
```
官網文檔:https://pkg.go.dev/os@go1.18.10
- Golang簡介
- 開發環境
- Golang安裝
- 編輯器及快捷鍵
- vscode插件
- 第一個程序
- 基礎數據類型
- 變量及匿名變量
- 常量與iota
- 整型與浮點型
- 復數與布爾值
- 字符串
- 運算符
- 算術運算符
- 關系運算符
- 邏輯運算符
- 位運算符
- 賦值運算符
- 流程控制語句
- 獲取用戶輸入
- if分支語句
- for循環語句
- switch語句
- break_continue_goto語法
- 高階數據類型
- pointer指針
- array數組
- slice切片
- slice切片擴展
- map映射
- 函數
- 函數定義和調用
- 函數參數
- 函數返回值
- 作用域
- 函數形參傳遞
- 匿名函數
- 高階函數
- 閉包
- defer語句
- 內置函數
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 編碼
- 字符與字節
- 字符串
- 讀寫文件
- 結構體
- 類型別名和自定義類型
- 結構體聲明
- 結構體實例化
- 模擬構造函數
- 方法接收器
- 匿名字段
- 嵌套與繼承
- 序列化
- 接口
- 接口類型
- 值接收者和指針接收者
- 類型與接口對應關系
- 空接口
- 接口值
- 類型斷言
- 并發編程
- 基本概念
- goroutine
- channel
- select
- 并發安全
- 練習題
- 第三方庫
- Survey
- cobra