加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读