작은 파일이 많이 있는데 한 줄씩 읽고 싶지 않습니다.
Go에 전체 파일을 문자열 변수로 읽는 함수가 있습니까?
답변
사용 ioutil.ReadFile
:
func ReadFile(filename string) ([]byte, error)
ReadFile은 filename으로 이름이 지정된 파일을 읽고 내용을 반환합니다. 성공적인 호출은 err == EOF가 아니라 err == nil을 리턴합니다. ReadFile은 전체 파일을 읽으므로 Read의 EOF를보고 할 오류로 취급하지 않습니다.
[]byte
대신을 얻을 수 string
있습니다. 실제로 필요한 경우 변환 할 수 있습니다 .
s := string(buf)
답변
내용을로 원하는 경우 string
간단한 해결책은 패키지 의 ReadFile
함수 를 사용하는 것입니다 io/ioutil
. 이 함수는 bytes
쉽게로 변환 할 수 있는 슬라이스를 반환 합니다 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'
}
답변
이 모든 파일을 연결하는 효율성에 대해 정말로 우려하는 경우 가장 좋은 방법은 파일을 모두 동일한 바이트 버퍼에 복사하는 것입니다.
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())
그러면 각 파일이 열리고 내용이 buf로 복사 된 다음 파일이 닫힙니다. 상황에 따라 실제로 변환하지 않아도 될 수 있습니다. 마지막 행은 buf.Bytes ()에 원하는 데이터가 있음을 보여주는 것입니다.
답변
이것이 내가 한 방법입니다.
package main
import (
"fmt"
"os"
"bytes"
"log"
)
func main() {
filerc, err := os.Open("filename")
if err != nil{
log.Fatal(err)
}
defer filerc.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(filerc)
contents := buf.String()
fmt.Print(contents)
}
답변
저는 컴퓨터를 가지고 있지 않으므로 초안을 작성합니다. 내가 말한 내용이 명확하지 않을 수 있습니다.
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()
}