Respuestas:
Uso ioutil.ReadFile
:
func ReadFile(filename string) ([]byte, error)
ReadFile lee el archivo nombrado por nombre de archivo y devuelve el contenido. Una llamada exitosa devuelve err == nil, no err == EOF. Debido a que ReadFile lee todo el archivo, no trata un EOF de Read como un error que se debe informar.
Obtendrá un en []byte
lugar de un string
. Se puede convertir si es realmente necesario:
s := string(buf)
Si solo desea el contenido como string
, entonces la solución simple es usar la ReadFile
función del io/ioutil
paquete. Esta función devuelve una porción de la bytes
cual puede convertir fácilmente a 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'
}
Creo que lo mejor que puedes hacer, si realmente te preocupa la eficacia de concatenar todos estos archivos, es copiarlos en el mismo búfer de bytes.
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())
Esto abre cada archivo, copia su contenido en buf, luego cierra el archivo. Dependiendo de su situación, es posible que no necesite convertirlo, la última línea es solo para mostrar que buf.Bytes () tiene los datos que está buscando.
No estoy con la computadora, así que escribo un borrador. Podrías estar claro de lo que digo.
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()
}