Câu trả lời:
Sử dụng ioutil.ReadFile
:
func ReadFile(filename string) ([]byte, error)
ReadFile đọc tệp có tên theo tên tệp và trả về nội dung. Cuộc gọi thành công trả về err == nil, không phải err == EOF. Vì ReadFile đọc toàn bộ tệp, nó không coi EOF từ Read là lỗi được báo cáo.
Bạn sẽ nhận được một []byte
thay vì một string
. Nó có thể được chuyển đổi nếu thực sự cần thiết:
s := string(buf)
Nếu bạn chỉ muốn nội dung như string
, thì giải pháp đơn giản là sử dụng ReadFile
hàm từ io/ioutil
gói. Hàm này trả về một lát bytes
mà bạn có thể dễ dàng chuyển đổi thành 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'
}
Tôi nghĩ rằng điều tốt nhất để làm, nếu bạn thực sự lo lắng về hiệu quả của việc ghép tất cả các tệp này, là sao chép tất cả chúng vào cùng một bộ đệm byte.
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())
Thao tác này sẽ mở từng tệp, sao chép nội dung của nó vào buf, sau đó đóng tệp. Tùy thuộc vào tình huống của bạn mà bạn có thể không thực sự cần phải chuyển đổi nó, dòng cuối cùng chỉ để hiển thị rằng buf.Bytes () có dữ liệu bạn đang tìm kiếm.
Tôi không có máy tính, vì vậy tôi viết một bản nháp. Bạn có thể rõ ràng về những gì tôi nói.
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()
}