Jawaban:
Gunakan ioutil.ReadFile
:
func ReadFile(filename string) ([]byte, error)
ReadFile membaca file bernama nama file dan mengembalikan konten. Panggilan yang berhasil mengembalikan err == nil, bukan err == EOF. Karena ReadFile membaca seluruh file, itu tidak memperlakukan EOF dari Baca sebagai kesalahan untuk dilaporkan.
Anda akan mendapatkan yang []byte
bukan string
. Ini dapat dikonversi jika benar - benar diperlukan:
s := string(buf)
Jika Anda hanya menginginkan konten sebagai string
, maka solusi sederhana adalah dengan menggunakan ReadFile
fungsi dari io/ioutil
paket. Fungsi ini mengembalikan sepotong bytes
yang Anda dapat dengan mudah dikonversi menjadi 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'
}
Saya pikir hal terbaik yang harus dilakukan, jika Anda benar-benar khawatir tentang efisiensi menggabungkan semua file-file ini, adalah menyalin semua ke buffer byte yang sama.
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())
Ini membuka setiap file, menyalin isinya ke buf, lalu menutup file. Bergantung pada situasi Anda, Anda mungkin tidak perlu mengubahnya, baris terakhir hanya untuk menunjukkan bahwa buf.Bytes () memiliki data yang Anda cari.
Saya tidak menggunakan komputer, jadi saya menulis konsep. Anda mungkin jelas dengan apa yang saya katakan.
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()
}