[caption id="attachment_902" align="alignnone" width="300"]Golang标准库http/url Values Golang标准库[/caption] 今天人我们继续分析os包,这个包其实很多估计还待几天我们才能分析完这个包--也谢谢大家的持续关注!!!我看网上搜索mac golang的比较多,我就也用mac os开发吧!截图我的环境 mac os golang 第一个我们讲的是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标准库分析,请继续关注我们

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部