Суть одной программы состоит в том, что она умеет хранить любой бинарный файл, разбивая его на куски фиксированного размера плюс остаток. Куски сохраняются в директорию blobs, где каждый назван по хэшу криптографической функции от содержимого. Хэши хранятся в БД и ассоциированы с именем исходного файла.
Нужно затем воссоздать исходный файл, склеив куски по очереди.
Не получается корректно написать функцию getBlobReader. На входе keys (хэш-суммы), на выходе - один io.ReadCloser, который умеет читать со всех кусков по очереди, пока все не закончатся.
Набросал код для примера:
package main
import (
"io"
"log"
"os"
"path/filepath"
)
func getBlobReader(keys []string) (io.ReadCloser, error) {
var rc io.ReadCloser
var err error
for _, key := range keys {
filePath := filepath.Join(".", "blobs", key)
rc, err = os.Open(filePath)
if err != nil {
return nil, err
}
}
return rc, nil
}
func main() {
keys := []string{
"2050-part1",
"2050-part2",
"2050-part3",
}
rc, err := getBlobReader(keys)
if err != nil {
log.Fatalln(err)
}
_, err = io.Copy(os.Stdout, rc)
if err != nil {
log.Fatalln(err)
}
log.Println("Done")
}