Go 系統編程不求人:os 包全面解析

Go 語言 os 包用法簡述

1. os.Args 獲取命令行參數

os.Args 是一個 []string 類型的 slice, 它包含了命令行調用程序時傳入的所有參數。

通過它可以訪問到命令行參數。

package main
import (
    "fmt"
    "os"
)
func main() {
    args := os.Args
    fmt.Println(args)
}

在終端運行:

go run demo.go a b c

輸出:

[demo.go a b c]

args[0] 永遠都是程序本身的路徑, args[1:] 包含所有參數。

可以通過遍歷和索引來訪問單個參數。

for _, arg := range os.Args[1:] {
    fmt.Println(arg) 
}

2. os.Create 創建文件

os.Create() 會創建指定名稱的文件, 返回一個 * File 和錯誤信息。

file, err := os.Create("test.txt")
if err != nil {
    return err
}
defer file.Close()

3. os.Open 打開文件

os.Open() 會以只讀的方式打開指定名稱的文件, 返回一個 * File 和錯誤信息。

file, err := os.Open("test.txt") 
if err != nil {
    return err
}
defer file.Close()

4. os.StartProcess 啓動新進程

os.StartProcess 可以用來啓動一個新進程。

cmd := exec.Command("ls", "-l")
err := cmd.Start()
if err != nil {
    log.Fatal(err)
}
log.Printf("Waiting for command to finish...")
err = cmd.Wait() 
log.Printf("Command finished with error: %v", err)

5. os.Getenv 獲取環境變量

os.Getenv 可以獲取指定的環境變量的值。

os.Getenv("GOPATH")

6. os.Chdir 切換當前工作目錄

os.Chdir 可以切換當前進程的工作目錄。

err := os.Chdir("/tmp")
if err != nil {
    log.Fatal(err)
}

7. os.Mkdir 創建目錄

os.Mkdir 可以創建一個目錄。

package main
import (
  "log"
  "os"
)
func main() {
  err := os.Mkdir("testdir", 0755)
  if err != nil {
    log.Fatal(err)
  }
}

8. os.Remove 刪除文件

os.Remove 可以刪除指定的文件或目錄。

err := os.Remove("test.txt")
if err != nil {
    log.Fatal(err)
}

9. os.Rename 重命名文件

os.Rename 可以重命名文件或目錄。

package main
import (
  "log"
  "os"
)
func main() {
  err := os.Rename("test.txt", "test_new.txt")
  if err != nil {
    log.Fatal(err)
  }
}

10. os.Truncate 截斷文件

os.Truncate 可以對文件進行截斷, 使得文件只保留截斷之前的內容。

package main
import (
  "log"
  "os"
)
func main() {
  f, err := os.OpenFile("test.txt", os.O_RDWR, 0644)
  if err != nil {
    log.Fatal(err)
  }
  defer f.Close()
  err = os.Truncate("test.txt", 10)
  if err != nil {
    log.Fatal(err)
  }
}

11. os.TempDir 獲取臨時目錄

os.TempDir 可以獲取當前系統的臨時文件目錄。

package main
import (
  "fmt"
  "os"
)
func main() {
  tmpDir := os.TempDir()
  fmt.Println(tmpDir)
}

12. os.Getpagesize 獲取頁面大小

os.Getpagesize 可以獲取操作系統的頁面大小。

  size := os.Getpagesize()
  fmt.Println(size)

13. os.Getwd 獲取當前工作目錄

os.Getwd 可以獲取當前進程的工作目錄。

package main
import (
  "fmt"
  "log"
  "os"
)
func main() {
  dir, err := os.Getwd()
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println(dir)
}

14. os.Geteuid 獲取有效用戶 ID

os.Geteuid 可以獲取調用進程的用戶 ID。

uid := os.Geteuid()
fmt.Println(uid)

15. os.Hostname 獲取主機名

os.Hostname 可以獲取主機的名稱。

name, err := os.Hostname()
if err != nil {
    fmt.Printf("Error: %v\n", err)
    return
}
fmt.Println(name)

16. os.Getpid 獲取當前進程 id

os.Getpid 可以獲取當前進程的進程 ID。

pid := os.Getpid()
fmt.Println(pid)

17. os.Environ 獲取環境變量

os.Environ 可以獲取當前進程的環境變量。

env := os.Environ()
for _, v := range env {
    fmt.Println(v)
}

18. os.Exit 退出當前進程

os.Exit 可以退出當前執行的進程。

os.Exit(1)

19. os.IsExist 判斷文件或文件夾是否存在

os.IsExist 可以判斷一個文件或文件夾是否存在。

package main
import (
  "fmt"
  "os"
)
func main() {
  if _, err := os.Stat("/path/to/file"); os.IsNotExist(err) {
    fmt.Println("file does not exist")
  }
}

20. os.Stat 獲取文件信息

os.Stat 可以獲取文件或目錄的信息。

info, err := os.Stat("test.txt")
if err != nil {
    log.Fatal(err)
}
fmt.Println(info.Size()) // 文件大小

21. os.ReadFile 讀取整個文件

os.ReadFile 可以讀取整個文件的內容, 返回字節 slice。

data, err := os.ReadFile("test.txt") 
if err != nil {
    log.Fatal(err)
}
fmt.Print(string(data))

22. os.WriteFile 寫入文件

os.WriteFile 可以將數據寫入文件。

data := []byte("Hello World") 
err := os.WriteFile("data.txt", data, 0644)
if err != nil {
    log.Fatal(err)
}

23. 總結

以上就是 Go 語言 os 包的簡要用法介紹, os 包提供了豐富的系統級操作函數, 可以用來獲取環境信息、讀取文件、執行進程等非常實用。

通過合理利用 os 包的功能可以開發出更強大的系統級程序。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/_1dZ4sXuSB1j5TO4DVHwGA