Answers:
func ReadFile(filename string) ([]byte, error)
ReadFile读取以文件名命名的文件并返回内容。成功的调用将返回err == nil,而不是err == EOF。由于ReadFile读取整个文件,因此不会将Read中的EOF视为要报告的错误。
您会得到一个[]byte
而不是string
。如果确实需要,可以将其转换为:
s := string(buf)
如果只想将内容作为string
,则简单的解决方案是使用包中的ReadFile
函数io/ioutil
。此函数返回一个切片bytes
,您可以轻松将其转换为string
。
package main
import (
"fmt"
"io/ioutil"
)
func main() {
b, err := ioutil.ReadFile("file.txt") // just pass the file name
if err != nil {
fmt.Print(err)
}
fmt.Println(b) // print the content as 'bytes'
str := string(b) // convert content to a 'string'
fmt.Println(str) // print the content as a 'string'
}
我认为,如果您真的担心串联所有这些文件的效率,最好的办法是将它们全部复制到同一字节缓冲区中。
buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
f, _ := os.Open(filename) // Error handling elided for brevity.
io.Copy(buf, f) // Error handling elided for brevity.
f.Close()
}
s := string(buf.Bytes())
这将打开每个文件,将其内容复制到buf中,然后关闭文件。根据您的情况,您可能实际上不需要转换它,最后一行只是显示buf.Bytes()具有您要查找的数据。
我不在电脑上,所以我写了草稿。您可能不明白我在说什么。
func main(){
const dir = "/etc/"
filesInfo, e := ioutil.ReadDir(dir)
var fileNames = make([]string, 0, 10)
for i,v:=range filesInfo{
if !v.IsDir() {
fileNames = append(fileNames, v.Name())
}
}
var fileNumber = len(fileNames)
var contents = make([]string, fileNumber, 10)
wg := sync.WaitGroup{}
wg.Add(fileNumber)
for i,_:=range content {
go func(i int){
defer wg.Done()
buf,e := ioutil.Readfile(fmt.Printf("%s/%s", dir, fileName[i]))
defer file.Close()
content[i] = string(buf)
}(i)
}
wg.Wait()
}