通过Golang自带的os包实现几个小示例;
实验环境:Ubuntu16.04
Golang:go version go1.11 linux/amd64
示例1、模拟shell启动脚本实现,不同的参数执行不同的输出。
package main
import (
"fmt"
"os"
)
func main() {
// 程序需要带一个参数
if len(os.Args) < 2 {
fmt.Println("缺少一个參數")
fmt.Println("Usage: start|stop|restart|reconfig")
return
} else if len(os.Args) > 2 {
fmt.Println("请核对参数是否正确!")
return
}
// 这里使用os.Args来获取用户输入的参数,[1]表示程序后面跟的第一个参数
switch finger := os.Args[1]; finger {
case "start":
fmt.Println("正在启动服务!")
case "stop":
fmt.Println("正在停止服务!")
case "restart":
fmt.Println("重启服务!")
case "reconfig":
fmt.Println("重新加载配置!")
default: //default case
fmt.Println("参数有误,请使用以下参数.")
fmt.Println("Usage: start|stop|restart|reconfig")
}
}
执行效果:
root@swper-ubuntu:~/Desktop/workpath/explame# ./g3
缺少一个參數
root@swper-ubuntu:~/Desktop/workpath/explame# ./g3 start
`
正在启动服务!
示例2:读取文件,每一个字符换一行。
package main
import (
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("/etc/hosts") // For read access.
if err != nil {
log.Fatal(err)
}
defer file.Close()
data := make([]byte, 1) //这里的1是指一个字节来切分,所以读取出来的就是每一个字符一行
for {
count, err := file.Read(data)
if count == 0 {
break
}
if err != nil {
panic(err)
}
fmt.Printf("read %d bytes: %q\n", count, data[:count])
}
}
示例3:写入文件,运行即生成file文件,并写入Foo到file中.
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Create("file")
if err != nil {
panic(err)
}
defer f.Close()
b := []byte("Foo")
n, err := f.Write(b)
if err != nil {
panic(err)
}
fmt.Println(n)
}
示例4:写文件,运行时加入参数名,参数名为文件名,并统计写入的文件字节数.
package main
import (
"fmt"
"os"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Please set a file name.")
return
}
filename := os.Args[1]
f, err := os.Create(filename)
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
b := []byte("Hello Writing to Files!")
n, err := f.Write(b)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("The number of bytes written: ", n)
}
运行效果:
root@swper-ubuntu:~/Desktop/workpath/explame# go run g7.go file.txt
The number of bytes written: 23
示例5:创建目录
package main
import (
"fmt"
"os"
)
func PathExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
func main() {
pathdir := "/tmp/files"
//判断目录是否存在
exist, _ := PathExists(pathdir)
if exist {
//如果存在
fmt.Printf("创建目录失败,目录已经存在! ")
} else {
//不存在则创建
os.Mkdir(pathdir, os.ModePerm)
fmt.Print("目录创建成功!")
}
}
示例6:获取系统当前用户名,主机名,uid 和gid等
package main
import (
"fmt"
"os"
"os/exec"
)
//os包中的一些常用函数
func main() {
//获取主机名
hostname, err := os.Hostname()
if err == nil {
fmt.Println("Hostname:", hostname)
}
//获取当前目录
dirpath, err := os.Getwd()
if err == nil {
fmt.Println("PATH:", dirpath)
}
//获取当前用戶名
var whoami []byte
var cmd *exec.Cmd
cmd = exec.Command("whoami")
whoami, err = cmd.Output()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Println("Username:", string(whoami))
//获取用户ID
fmt.Println("UID:", os.Getuid())
//获取组ID
fmt.Println("GROUPID:", os.Getgid())
//获取进程ID
fmt.Println("PID:", os.Getpid())
//获取父进程ID
fmt.Println("PPID", os.Getppid())
//获取环境变量的值
fmt.Println("GOPATH:", os.Getenv("GOPATH"))
//设置环境变量的值
os.Setenv("TEST", "testenv")
fmt.Println("TEST:", os.Getenv("TEST"))
}
输出效果:
root@swper-ubuntu:~/Desktop/workpath/explame# go run g6.go
Hostname: swper-ubuntu
PATH: /root/Desktop/workpath/explame
Username: root
UID: 0
GROUPID: 0
PID: 24973
PPID 24950
GOPATH: /root/go
TEST: testenv
ipaddr: 10.0.10.15