1 回答

TA貢獻1811條經驗 獲得超4個贊
以下循環掛起,因為chashes未關閉。
for hash := range chashes {
fmt.Println(hash)
}
chashes在所有哈希器完成后通過關閉來修復。使用 sync.WaitGroup 等待哈希器完成。
func generateHash(cfiles chan string, chashes chan string) {
var wg sync.WaitGroup
for filename := range cfiles {
wg.Add(1)
go func(filename string) {
defer wg.Done()
var checksum string
var oError bool = false
file, err := os.Open(filename)
if err != nil {
oError = true
errorMsg := "ERROR: " + err.Error()
log.Println(errorMsg)
checksum = errorMsg
}
defer file.Close()
if !oError {
hash := sha256.New()
if _, err := io.Copy(hash, file); err != nil {
errorMsg := "ERROR: " + err.Error()
log.Println(errorMsg)
checksum = errorMsg
}
if len(checksum) == 0 {
checksum = hex.EncodeToString(hash.Sum(nil))
}
}
chashes <- filename + "||" + checksum
}(filename)
} //for files
// Wait for the hashers to complete.
wg.Wait()
// Close the channel to cause main() to break
// out of for range on chashes.
close(chashes)
}
defer close(chashes)從中刪除run()。
- 1 回答
- 0 關注
- 108 瀏覽
添加回答
舉報