Вы можете использовать io.MultiWriter(...)
для одновременной отправки данных в несколько выходных потоков, таких как хэш и некоторая удаленная запись.
Например (примерно):
sha := sha256.New()
filer := filer.New(...) // Some Writer that stores the bytes for you?
err := io.Copy(io.MultiWriter(sha, filer), r)
// TODO: handle error
// Now sha.Sum(nil) has the file digest and "filer" got sent all the bytes.
Обратите внимание, что io.Multiwriter
может принимать столько писателей, сколько вы хотите, поэтому вы можете одновременно вычислять дополнительные хэши (например, md5, sha1 и т. Д.) Или даже отправлять файл в несколько мест, например ::
md5, sha1, sha256, sha512 := md5.New(), sha1.New(), sha256.New(), sha512.New()
s3Writer, gcsWriter := filer.NewS3Writer(), filer.NewGCSWriter()
mw := io.MultiWriter(awsWriter, gcsWriter, md5, sha1, sha256, sha512)
err := io.Copy(mw, r)
// TODO: handle error
// Now you've got all the hashes for the file and it's stored in the cloud.