Antworten:
Verwendung ioutil.ReadFile
:
func ReadFile(filename string) ([]byte, error)
ReadFile liest die nach Dateiname benannte Datei und gibt den Inhalt zurück. Ein erfolgreicher Aufruf gibt err == nil zurück, nicht err == EOF. Da ReadFile die gesamte Datei liest, wird ein EOF aus Read nicht als zu meldender Fehler behandelt.
Sie erhalten eine []byte
statt einer string
. Es kann umgewandelt werden , wenn wirklich notwendig:
s := string(buf)
Wenn Sie nur den Inhalt als möchten string
, besteht die einfache Lösung darin, die ReadFile
Funktion aus dem io/ioutil
Paket zu verwenden. Diese Funktion gibt ein Slice zurück, von bytes
dem Sie es einfach in ein konvertieren können 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'
}
Ich denke, das Beste, was Sie tun können, wenn Sie wirklich über die Effizienz der Verkettung all dieser Dateien besorgt sind, ist, sie alle in denselben Byte-Puffer zu kopieren.
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())
Dies öffnet jede Datei, kopiert ihren Inhalt in buf und schließt die Datei. Abhängig von Ihrer Situation müssen Sie es möglicherweise nicht konvertieren. In der letzten Zeile wird lediglich angezeigt, dass buf.Bytes () die gesuchten Daten enthält.
Ich bin nicht mit Computer, also schreibe ich einen Entwurf. Sie könnten klar sein, was ich sage.
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()
}