Відповіді:
Використання ioutil.ReadFile
:
func ReadFile(filename string) ([]byte, error)
ReadFile читає файл, названий ім'ям файлу, і повертає вміст. Успішний виклик повертає err == nil, не err == EOF. Оскільки ReadFile читає весь файл, він не трактує EOF з Read як помилку, про яку потрібно повідомити.
Ви отримаєте []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()
}