[caption id="attachment_902" align="alignnone" width="300"] Golang标准库[/caption] 今天人我们继续分析os包,这个包其实很多估计还待几天我们才能分析完这个包--也谢谢大家的持续关注!!!我看网上搜索mac golang的比较多,我就也用mac os开发吧!截图我的环境 第一个我们讲的是os.IsExists()函数和os.IsNotExists(),他们的函数的原形是func IsExist(err error) bool func IsNotExist(err error) bool 都是传入一个err返回bool 这里注意了 err已经定义好了
/* var ( ErrInvalid = errors.New("invalid argument") ErrPermission = errors.New("permission denied") ErrExist = errors.New("file already exists") ErrNotExist = errors.New("file does not exist") ) */这里我们看到了errors这个包,那我们讲一下这个包,这个包就一个方法就是errors.New()函数原形是func New(text string) error实例代码
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 } }下面通过实例代码讲解一下
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()会报错的 }//我们弄出一个文件已经存在的错误来实验os.IsExists() 如下是Os定义的常量
/* 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 } }第二个讲解的是os.IsPathSeparator()函数原形是func IsPathSeparator(c uint8) bool注意传入的是字节''不能用""这个很简单判断是不是系统的分隔符
import ( "fmt" "os" ) func main() { //注意点哈 就是传参必须是''单引号不能是“”因为是字符类型的 fmt.Println(os.IsPathSeparator('/')) //我是mac os 所以/是目录分隔符 fmt.Println(os.IsPathSeparator('\\')) //这个不是 fmt.Println(os.IsPathSeparator('.')) //这个也不是 }第三个讲解的是os.IsPermission()跟上边的一样都是判断的,这个是判断有木有权限,函数原形是func IsPermission(err error) bool返回的依然是bool类型,实例代码上
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 } }第四个是os.Lchown()这个函数的原形是func Lchown(name string, uid, gid int) error,看似简单的函数确包含了很多知识,譬如uid和gid是文件的就像我现在环境的-rwxr-xr-x 1.go所属的用户id和群组id,实例代码讲解一下牵扯的看看有多少
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 }第五个是os.Link()函数原形是func Link(oldname, newname string) error创建硬连接--懂linux的肯定理解 举个实例
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") }如果您喜欢微度网络的golang标准库分析,请继续关注我们
发表评论 取消回复