go标准库os实现的几个小示例


 

通过Golang自带的os包实现几个小示例; 

实验环境:Ubuntu16.04 

Golang:go version go1.11 linux/amd64

 
示例1、模拟shell启动脚本实现,不同的参数执行不同的输出。
  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "os" 
  6.  
  7. func main() { 
  8.     // 程序需要带一个参数 
  9.     if len(os.Args) < 2 { 
  10.         fmt.Println("缺少一个參數") 
  11.         fmt.Println("Usage: start|stop|restart|reconfig") 
  12.         return 
  13.     } else if len(os.Args) > 2 { 
  14.         fmt.Println("请核对参数是否正确!") 
  15.         return 
  16.     } 
  17.  
  18.     // 这里使用os.Args来获取用户输入的参数,[1]表示程序后面跟的第一个参数 
  19.     switch finger :os.Args[1]; finger { 
  20.     case "start": 
  21.         fmt.Println("正在启动服务!") 
  22.     case "stop": 
  23.         fmt.Println("正在停止服务!") 
  24.     case "restart": 
  25.         fmt.Println("重启服务!") 
  26.     case "reconfig": 
  27.         fmt.Println("重新加载配置!") 
  28.     default: //default case 
  29.         fmt.Println("参数有误,请使用以下参数.") 
  30.         fmt.Println("Usage: start|stop|restart|reconfig") 
  31.     } 

执行效果:

  1. root@swper-ubuntu:~/Desktop/workpath/explame# ./g3  
  2. 缺少一个參數 
  3. root@swper-ubuntu:~/Desktop/workpath/explame# ./g3 start 
  4. 正在启动服务! 

 

示例2:读取文件,每一个字符换一行。

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "log" 
  6.     "os" 
  7.  
  8. func main() { 
  9.     file, err :os.Open("/etc/hosts") // For read access. 
  10.     if err != nil { 
  11.         log.Fatal(err) 
  12.     } 
  13.     defer file.Close() 
  14.  
  15.     data :make([]byte, 1)  //这里的1是指一个字节来切分,所以读取出来的就是每一个字符一行
  16.  
  17.     for { 
  18.         count, err :file.Read(data) 
  19.         if count == 0 { 
  20.             break 
  21.         } 
  22.         if err != nil { 
  23.             panic(err) 
  24.         } 
  25.         fmt.Printf("read %d bytes: %q\n", count, data[:count]) 
  26.     } 

 

示例3:写入文件,运行即生成file文件,并写入Foo到file中.

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "os" 
  6.  
  7. func main() { 
  8.     f, err :os.Create("file") 
  9.     if err != nil { 
  10.         panic(err) 
  11.     } 
  12.     defer f.Close() 
  13.  
  14.     b := []byte("Foo") 
  15.     n, err :f.Write(b) 
  16.     if err != nil { 
  17.         panic(err) 
  18.     } 
  19.     fmt.Println(n) 
  20.  

 

 

示例4:写文件,运行时加入参数名,参数名为文件名,并统计写入的文件字节数.

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "os" 
  6.  
  7. func main() { 
  8.     if len(os.Args) < 2 { 
  9.         fmt.Println("Please set a file name.") 
  10.         return 
  11.     } 
  12.  
  13.     filename :os.Args[1] 
  14.  
  15.     f, err :os.Create(filename) 
  16.     if err != nil { 
  17.         fmt.Println(err) 
  18.         return 
  19.     } 
  20.     defer f.Close() 
  21.  
  22.     b := []byte("Hello Writing to Files!") 
  23.     n, err :f.Write(b) 
  24.     if err != nil { 
  25.         fmt.Println(err) 
  26.         return 
  27.     } 
  28.  
  29.     fmt.Println("The number of bytes written: ", n) 

运行效果:

  1. root@swper-ubuntu:~/Desktop/workpath/explame# go run g7.go file.txt 
  2. The number of bytes written:  23 

 

示例5:创建目录

 

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "os" 
  6.  
  7. func PathExists(path string) (bool, error) { 
  8.     _, err :os.Stat(path) 
  9.     if err == nil { 
  10.         return true, nil 
  11.     } 
  12.     if os.IsNotExist(err) { 
  13.         return false, nil 
  14.     } 
  15.     return false, err 
  16.  
  17. func main() { 
  18.     pathdir :"/tmp/files" 
  19.     //判断目录是否存在 
  20.     exist, _ :PathExists(pathdir) 
  21.     if exist { 
  22.         //如果存在 
  23.         fmt.Printf("创建目录失败,目录已经存在! ") 
  24.     } else { 
  25.         //不存在则创建 
  26.         os.Mkdir(pathdir, os.ModePerm) 
  27.         fmt.Print("目录创建成功!") 
  28.  
  29.     } 

 

示例6:获取系统当前用户名,主机名,uid 和gid等

  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "os" 
  6.     "os/exec" 
  7.  
  8. //os包中的一些常用函数 
  9.  
  10. func main() { 
  11.  
  12.     //获取主机名 
  13.     hostname, err :os.Hostname() 
  14.     if err == nil { 
  15.         fmt.Println("Hostname:", hostname) 
  16.     } 
  17.  
  18.     //获取当前目录 
  19.     dirpath, err :os.Getwd() 
  20.     if err == nil { 
  21.         fmt.Println("PATH:", dirpath) 
  22.     } 
  23.  
  24.     //获取当前用戶名 
  25.     var whoami []byte 
  26.     var cmd *exec.Cmd 
  27.  
  28.     cmd = exec.Command("whoami") 
  29.     whoami, err = cmd.Output() 
  30.     if err != nil { 
  31.         fmt.Println(err) 
  32.         os.Exit(1) 
  33.     } 
  34.     fmt.Println("Username:", string(whoami)) 
  35.  
  36.     //获取用户ID 
  37.     fmt.Println("UID:", os.Getuid()) 
  38.  
  39.     //获取组ID 
  40.     fmt.Println("GROUPID:", os.Getgid()) 
  41.  
  42.     //获取进程ID 
  43.     fmt.Println("PID:", os.Getpid()) 
  44.  
  45.     //获取父进程ID 
  46.     fmt.Println("PPID", os.Getppid()) 
  47.  
  48.     //获取环境变量的值 
  49.     fmt.Println("GOPATH:", os.Getenv("GOPATH")) 
  50.  
  51.     //设置环境变量的值 
  52.     os.Setenv("TEST", "testenv") 
  53.     fmt.Println("TEST:", os.Getenv("TEST")) 

输出效果:

  1. root@swper-ubuntu:~/Desktop/workpath/explame# go run g6.go  
  2. Hostname: swper-ubuntu 
  3. PATH: /root/Desktop/workpath/explame 
  4. Username: root 
  5.  
  6. UID: 0 
  7. GROUPID: 0 
  8. PID: 24973 
  9. PPID 24950 
  10. GOPATH: /root/go 
  11. TEST: testenv 
  12. ipaddr: 10.0.10.15