Odpowiedzi:
Zastosowanie ioutil.ReadFile
:
func ReadFile(filename string) ([]byte, error)
ReadFile czyta plik o nazwie nazwa_pliku i zwraca zawartość. Pomyślne wywołanie zwraca err == nil, a nie err == EOF. Ponieważ ReadFile odczytuje cały plik, nie traktuje EOF z Read jako błędu do zgłoszenia.
Otrzymasz []byte
zamiast string
. To może być przekształcony czy naprawdę konieczne:
s := string(buf)
Jeśli chcesz, aby zawartość była po prostu jako string
, prostym rozwiązaniem jest użycie ReadFile
funkcji z io/ioutil
pakietu. Ta funkcja zwraca wycinek, bytes
który można łatwo przekonwertować na plik 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'
}
Myślę, że najlepszą rzeczą do zrobienia, jeśli naprawdę martwisz się o skuteczność łączenia wszystkich tych plików, jest skopiowanie ich wszystkich do tego samego bufora bajtów.
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())
To otwiera każdy plik, kopiuje jego zawartość do bufora, a następnie zamyka plik. W zależności od sytuacji, w rzeczywistości konwersja może nie być konieczna, ostatnia linia służy po prostu do pokazania, że buf.Bytes () zawiera dane, których szukasz.
Nie mam komputera, więc piszę szkic. Możesz być pewien, co mówię.
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()
}