os

Hostname

返回内核提供的主机名

  1. func Hostname() (name string, err error)
  2. fmt.Println(os.Hostname()) // macBook-Pro.local <nil>

Environ

返回所有的环境变量,返回值格式为“key=value”的字符串的切片拷贝

  1. func Environ() []string

Getenv

检索并返回名为 key 的环境变量的值。如果不存在该环境变量则会返回空字符串。

  1. func Getenv(key string) string
  2. fmt.Println(os.Getenv("GOROOT")) // /usr/local/Cellar/go/1.12.7

Setenv

设置名为 key 的环境变量,如果出错会返回该错误。

  1. func Setenv(key, value string) error

Exit

让程序以给出的状态码 code 退出。程序会立刻终止,并且 defer 的函数不会被执行。

一般来说,状态码 0 表示成功,非 0 表示出错。

  1. func Exit(code int)

Getuid

返回调用者的用户 ID

  1. func Getuid() int

Getgid

返回调用者的组 ID

  1. func Getgid() int

Getpid

返回调用者所在进程的进程 ID。

  1. func Getpid() int

Getwd

返回当前目录的根路径。

  1. func Getwd() (dir string, err error)

Mkdir

使用指定的权限和名称创建一个目录。如果出错,会返回 *PathError 底层类型的错误。

  1. func Mkdir(name string, perm FileMode) error

MkdirAll

使用指定的权限和名称创建一个目录,包括任何必要的上级目录。成功返回 nil,否则返回错误。
权限位 perm 会应用在每一个被该函数创建的目录上。
如果 path 指定了一个已经存在的目录,MkdirAll 不做任何操作并返回 nil。

  1. func MkdirAll(path string, perm FileMode) error

Remove

删除指定的文件或目录。如果出错,会返回 *PathError 底层类型的错误。

  1. func Remove(name string) error

RemoveAll

递归的删除所有子目录和文件,如果出错,会返回 *PathError 底层类型的错误。

  1. func RemoveAll(path string) error

os/exec 通道

exec 包可以执行外部命令,它包装了 os.StartProcess 函数以便更容易的修正输入和输出,使用管道连接 I/O,以及作其它的一些调整。

  1. func LookPath(file string) (string, error)

在环境变量 PATH 指定的目录中搜索可执行文件,如果 file 中有斜杠,则只在当前目录搜索。返回完整路径或者相对于当前目录的一个相对路径。

  1. package main
  2. import (
  3. "fmt"
  4. "os/exec"
  5. )
  6. func main() {
  7. f, err := exec.LookPath("main")
  8. if err != nil {
  9. fmt.Println(err)
  10. }
  11. fmt.Println(f) // main.exe
  12. }

os/user 用户

os/user 包中的 Current() 函数来获取当前用户信息,该函数会返回一个 User 结构体:

  • Username:当前用户的名称
  • Uid: 用户 id
  • HomeDir: 用户主目录
  • Gid: 用户所属组 id


  1. func Current() (*User, error)
  1. package main
  2. import (
  3. "log"
  4. "os/user"
  5. )
  6. func main() {
  7. u, _ := user.Current()
  8. log.Println("用户名:", u.Username)
  9. log.Println("用户id", u.Uid)
  10. log.Println("用户主目录:", u.HomeDir)
  11. log.Println("主组id:", u.Gid)
  12. // 用户所在的所有的组的id
  13. s, _ := u.GroupIds()
  14. log.Println("用户所在的所有组:", s)
  15. }
  16. // log
  17. 2019/12/13 15:12:14 用户名: LENOVO-PC\Administrator
  18. 2019/12/13 15:12:14 用户id S-1-5-21-711400000-2334436127-1750000211-000
  19. 2019/12/13 15:12:14 用户主目录: C:\Users\Administrator
  20. 2019/12/13 15:12:14 主组id S-1-5-22-766000000-2300000100-1050000262-000
  21. 2019/12/13 15:12:14 用户所在的所有组: [S-1-5-32-544 S-1-5-22-000 S-1-5-21-777400999-2344436111-1750000262-003]

os/signal 信号

  1. 一个运行良好的程序在退出(正常退出或者强制退出,如 Ctrl+C,kill 等)时是可以执行一段清理代码的,将收尾工作做完后再真正退出。一般采用系统 Signal 来通知系统退出,如 kill pid,在程序中针对一些系统信号设置了处理函数,当收到信号后,会执行相关清理程序或通知各个子进程做自清理。
  2. Go语言中对信号的处理主要使用 os/signal 包中的两个方法,一个是 Notify 方法用来监听收到的信号,一个是 stop 方法用来取消监听。


  1. c 表示接收信号的 channel
  2. sig 表示设置要监听的信号,如果不设置表示监听所有的信号。
  3. func Notify(c chan<- os.Signal, sig ...os.Signal)
  1. c 表示停止信号的 channel
  2. func Stop(c chan<- os.Signal)

示例

Notify
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "os/signal"
  6. )
  7. func main() {
  8. c := make(chan os.Signal, 0)
  9. signal.Notify(c)
  10. // Block until a signal is received.
  11. s := <-c
  12. fmt.Println("Got signal:", s)
  13. }

运行该程序,然后在 CMD 窗口中通过 Ctrl+C 来结束该程序,便会得到输出结果:

  1. Got signal: interrupt

stop
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "os/signal"
  6. )
  7. func main() {
  8. c := make(chan os.Signal, 0)
  9. signal.Notify(c)
  10. signal.Stop(c) //不允许继续往c中存入内容
  11. s := <-c //c无内容,此处阻塞,所以不会执行下面的语句,也就没有输出
  12. fmt.Println("Got signal:", s)
  13. }

Stop 方法取消了 Notify 方法的监听,所以运行程序没有输出结果。