나는 골란에 초보자입니다. Amazon S3에서 여러 파일을 읽으 려합니다. s3gof3r 라이브러리를 사용하고 있습니다.golang을 사용하여 S3에서 여러 파일 읽기
이for i := 1; i <= fileNo; i++ {
go test(i, b)
}
func test(i int, b *Bucket)() {
fmt.Println("Loading file no:" + strconv.Itoa(i))
defer wg.Done()
r, _, err := b.GetReader("testFile_" + strconv.Itoa(i) + ".htm", nil)
buf := new(bytes.Buffer)
buf.ReadFrom(r)
fmt.Println(err)
fmt.Println("Completed file no:" + strconv.Itoa(i))
r.Close()
}
이 코드는 내가 약 200 파일 (예 : 200 (200 개) 파일에서 읽기 루틴을 이동)가있는 경우 확실히 작동하지만 내가 더 많은 파일을 읽을 수있는 경우는 (I 충돌 다음과 같이
이동 루틴입니다 내가 얻을
) 오류를 10,000 개 이상의 파일을 읽을해야하는 것은 오류가 'ReadFrom'를 사용에서 오는
panic: runtime error: invalid memory address or nil pointer dereference
panic(0x39fde0, 0xc8200100f0)
/usr/local/go/src/runtime/panic.go:464 +0x3e6
bytes.(*Buffer).ReadFrom(0xc8200d3f18, 0x0, 0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/bytes/buffer.go:176 +0x239
main.test(0x4c, 0xc8200bc8e0)
입니다. 이런 방식으로 ReadFrom을 사용하는 데 문제가 있습니까? 또는 이렇게 많은 파일을 읽는 작업을 수행하는 잘못된 방법입니까?
먼저 오류를 확인하십시오. – JimB
https://github.com/golang/go/wiki/CommonMistakes#using-goroutines-on-loop-iterator-variables – jbe
JimB는 언급 한 바와 같이'r, _, err : = ...'을 수행하지만 do 오류를 확인하지 말라. 뭔가 잘못되었다는 것과 반환 된'r'이'nil'이 될 가능성이 완전히 있으며, 이는 충돌을 설명 할 것이다. 먼저'r'에 액세스하려고 시도하기 전에'err'이'nil'인지 확인한 다음이 케이스를 처리해야합니다. – val