golang 文件操作
发布时间:2020-12-16 18:40:07 所属栏目:大数据 来源:网络整理
导读:操作文件是任何编程语言都绕不过,要掌握一门语言,知道如何操作文件是必不可少的,今天学习了下golang对文件操作的支持。 golang对文件的支持是在os package里。我无意将本文写成官方文档的模样,我只是想讨论如何利用这些接口操作文件。 OPEN funcOpenFile
操作文件是任何编程语言都绕不过,要掌握一门语言,知道如何操作文件是必不可少的,今天学习了下golang对文件操作的支持。 golang对文件的支持是在os package里。我无意将本文写成官方文档的模样,我只是想讨论如何利用这些接口操作文件。 OPEN funcOpenFile(namestring,flagint,permFileMode)(file*File,errerror) 我们看到了也有flag,也有FileMode.比如说我要读写打开一个文件,如果不存在就创建,如果存在,就追加写,如何写go 代码? f,err:=os.OpenFile("test.txt",os.O_CREATE|os.O_APPEND|os.O_RDWR,0660) if(err!=nil){ panic(err) } CLOSE 这个接口无甚好说。接口如下 func(f*File)Close()error 但说接口没啥说的,但是golang提供了defer,这是一个我认为很赞的特点,就是将不得不做的cleanup放到defer去做。go提供了defer解决这种困境,后面不用时刻惦记close,函数退出前,会执行close f,0660) if(err!=nil){ panic("openfilefailed") } deferf.Close() ... READ和WRITE 接口如下 func(f*File)Read(b[]byte)(nint,errerror) func(f*File)ReadAt(b[]byte,offint64)(nint,errerror) func(f*File)Write(b[]byte)(nint,errerror) func(f*File)WriteAt(b[]byte,errerror) func(f*File)WriteString(sstring)(retint,errerror) 看到代码片段,学习使用读写接口: read_buf:=make([]byte,32) varposint64=0 for{ n,err:=f.ReadAt(read_buf,pos) iferr!=nil&&err!=io.EOF{ panic(err) } ifn==0{ fmt.Printf("nfinishreadn") break } fmt.Printf("%s",string(read_buf[:n])) pos=pos+(int64)(n) } 在看一个代码片段: varbuff=make([]byte,1024) for{ n,err:=fi.Read(buff) iferr!=nil&&err!=io.EOF{ panic(err) } ifn==0{ break } if_,err:=fo.Write(buff[:n]);err!=nil{ panic(err) } } 最后,我写了一个完整的代码,完成简单cp功能,就叫mycp packagemain import"fmt" import"os" import"io" funcusage(){ fmt.Printf("%s%s%sn",os.Args[0],"filename","newfile") } funcmain(){ iflen(os.Args)!=3{ usage() return } filename_in:=os.Args[1] fi,err:=os.Open(filename_in) iferr!=nil{ panic(err) } deferfi.Close() filename_out:=os.Args[2] fo,err:=os.Create(filename_out) iferr!=nil{ panic(err) } deferfo.Close() varbuff=make([]byte,err:=fo.Write(buff[:n]);err!=nil{ panic(err) } } } 执行结果 manu@manu-hacks:~/code/go/self$./mycptest.txttest.bak manu@manu-hacks:~/code/go/self$difftest.txttest.bak manu@manu-hacks:~/code/go/self$cattest.txt thisistestfilecreatedbygo ifnotexisted,pleasecreatethisfile ifexisted,Pleasewriteappend helloworld,hellogo thisistestfilecreatedbygo ifnotexisted,hellogo (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |