当前位置: 首页 > 科技观察

如何选择Go文件读取方案

时间:2023-03-18 18:57:41 科技观察

文件处理是一个普遍的问题,而Go提供了非常多的文件读取方法,很容易让人陷入选择困难症。作为延伸,本文以不同大小的实际文件为例,比较它们的差异。创建不同大小的文件首先,我们需要有一个比较对象。鉴于电脑磁盘空间有限,本文比较了KB、MB、GB三个级别文件读取的差异。packagemainimport("bufio""math/rand""os""time")constcharset="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"varseededRand=rand.New(rand.NewSource(time.Now().UnixNano()))func(lengWithCharsetint)string{b:=make([]byte,length)fori:=rangeb{b[i]=charset[seededRand.Intn(len(charset))]}returnstring(b)}funcmain(){files:=map[string]int{"4KB.txt":4,"4MB.txt":4096,"4GB.txt":4194304,"16GB.txt":16777216}forname,number:=rangefiles{文件,err:=os.OpenFile(name,os.O_WRONLY|os.O_CREATE,0666)iferr!=nil{panic(err)}write:=bufio.NewWriter(file)fori:=0;我<数;i++{s:=StringWithCharset(1023)+"\n"write.WriteString(s)}file.Close()}}执行上面的代码,我们依次得到4KB、4MB、4GB、16GB的文件,它们是由每行1KB随机字符串内容。$ls-alh4kb.txt4MB.txt4GB.txt16GB.txt-rw-r--r--1slpstaff16GMar615:5716GB.txt-rw-r--r--1slpstaff4.0GMar615:544GB.txt-rw-r--r--1slpstaff4.0MMar615:534MB.txt-rw-r--r--1slpstaff4.0KMar615:164kb.txt接下来我们用不同的方式来读取这些文件的内容。整个文件加载Go提供了一次性读取文件内容的方法:os.ReadFile和ioutil.ReadFile。从Go1.16开始,ioutil.ReadFile等同于os.ReadFile。funcBenchmarkOsReadFile4KB(b*testing.B){fori:=0;我