封尘网

让学习成为一种习惯!

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

通过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