今天人我们继续分析os包,这个包其实很多估计还待几天我们才能分析完这个包–也谢谢大家的持续关注!!!我看网上搜索mac golang的比较多,我就也用mac os开发吧!截图我的环境
第一个我们讲的是os.IsExists()函数和os.IsNotExists(),他们的函数的原形是func IsExist(err error) bool func IsNotExist(err error) bool 都是传入一个err返回bool 这里注意了 err已经定义好了
[php]
/*
var (
ErrInvalid = errors.New("invalid argument")
ErrPermission = errors.New("permission denied")
ErrExist = errors.New("file already exists")
ErrNotExist = errors.New("file does not exist")
)
*/
[/php]
这里我们看到了errors这个包,那我们讲一下这个包,这个包就一个方法就是errors.New()函数原形是func New(text string) error实例代码
[php]
import (
"errors"
"fmt"
)
func main() {
//这里就一个方法func New(text string) error 我们可以自己定义
err := errors.New("widuu blog only golang")
if err != nil {
fmt.Println(err) //这里就是输出了我们自己定义的错误信息 //widuu blog only golang
}
}
[/php]
下面通过实例代码讲解一下
[php]
import (
"fmt"
"os"
)
func main() {
_, err := os.Open("widuu.go")
if err != nil {
fmt.Println(os.IsNotExist(err)) //true 证明文件已经存在
fmt.Println(err) //open widuu.go: no such file or directory
}
//这个时候你可以这样判断文件是否存在
f, err := os.Open("widuu.go")
if err != nil && os.IsNotExist(err) {
fmt.Println(f, "文件不存在") //为什么打印nil 是这样的如果file不存在 返回f文件的指针是nil的 所以我们不能使用defer f.Close()会报错的
}
[/php]
//我们弄出一个文件已经存在的错误来实验os.IsExists() 如下是Os定义的常量
[php]
/*
var (
ErrInvalid = errors.New("invalid argument")
ErrPermission = errors.New("permission denied")
ErrExist = errors.New("file already exists")
ErrNotExist = errors.New("file does not exist")
)
*/
fmt.Println(os.IsExist(os.ErrExist)) //这里就会输出true
//我们后边马上提到link
err = os.Link("osexists.go", "1.go")
if err != nil {
fmt.Println(os.IsExist(err)) //因为我1.go这个文件存在了 所以说返回true
}
}
[/php]
第二个讲解的是os.IsPathSeparator()函数原形是func IsPathSeparator(c uint8) bool注意传入的是字节”不能用””这个很简单判断是不是系统的分隔符
[php]
import (
"fmt"
"os"
)
func main() {
//注意点哈 就是传参必须是”单引号不能是“”因为是字符类型的
fmt.Println(os.IsPathSeparator(‘/’)) //我是mac os 所以/是目录分隔符
fmt.Println(os.IsPathSeparator(‘\\’)) //这个不是
fmt.Println(os.IsPathSeparator(‘.’)) //这个也不是
}
[/php]
第三个讲解的是os.IsPermission()跟上边的一样都是判断的,这个是判断有木有权限,函数原形是func IsPermission(err error) bool返回的依然是bool类型,实例代码上
[php]
import (
"fmt"
"os"
)
func main() {
//我们把chmod 000 1.go
_, err := os.Open("1.go")
if err != nil {
fmt.Println(os.IsPermission(err)) //true
fmt.Println(err) //open 1.go: permission denied
}
}
[/php]
第四个是os.Lchown()这个函数的原形是func Lchown(name string, uid, gid int) error,看似简单的函数确包含了很多知识,譬如uid和gid是文件的就像我现在环境的-rwxr-xr-x 1.go所属的用户id和群组id,实例代码讲解一下牵扯的看看有多少
[php]
import (
"fmt"
"os"
"reflect"
"syscall"
)
func main() {
f, err := os.Stat("widuu1.go") //前边讲过了
if err != nil {
fmt.Println(err)
}
a := reflect.ValueOf(f.Sys()) //这个大家可能不能理解什么意思 所以我用反射让大家看看这个值类型
fmt.Println(a) //<*syscall.Stat_t Value>
/*
type Stat_t struct {
Dev int32
Mode uint16
Nlink uint16
Ino uint64
Uid uint32
Gid uint32
Rdev int32
Pad_cgo_0 [4]byte
Atimespec Timespec
Mtimespec Timespec
Ctimespec Timespec
Birthtimespec Timespec
Size int64
Blocks int64
Blksize int32
Flags uint32
Gen uint32
Lspare int32
Qspare [2]int64
}
*/
//然后我们用值映射获取Uid Gid
fmt.Println(f.Sys().(*syscall.Stat_t).Uid, f.Sys().(*syscall.Stat_t).Gid) //我的mac 501 20
err = os.Lchown("widuu1.go", 100, 100)
if err != nil {
fmt.Println(os.IsPermission(err)) //注意这里有可能你没有 修改的权限 如果true肯定是修改不成功的
}
fi, err := os.Stat("widuu1.go")
if err != nil {
fmt.Println(err)
}
fmt.Println(fi.Sys().(*syscall.Stat_t).Uid, fi.Sys().(*syscall.Stat_t).Gid) //100 100
}
[/php]
第五个是os.Link()函数原形是func Link(oldname, newname string) error创建硬连接–懂linux的肯定理解
举个实例
[php]
import (
"fmt"
"os"
)
func main() {
err := os.Link("link.go", "widuu2.go")
if err != nil {
fmt.Println(os.IsExists(err)) //这里可能会出一个文件已经存在的错误
}
fmt.Println("widuu2.go create")
}
[/php]
如果您喜欢微度网络的golang标准库分析,请继续关注我们
未经允许,不得转载本站任何文章:微度网络 » golang讲解(go语言)标准库分析之os(3)
有疑问加站长微信联系(非本文作者)