第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

頻道掛起,可能沒(méi)有在正確的地方關(guān)閉

頻道掛起,可能沒(méi)有在正確的地方關(guān)閉

Go
森欄 2022-10-31 16:51:37
我正在嘗試在編寫(xiě)一個(gè)小程序的同時(shí)學(xué)習(xí) Go。程序應(yīng)該盡可能高效和快速地遞歸解析 PATH 并輸出完整的文件名(包括路徑)和文件的 sha256 文件哈希。如果文件散列生成失敗,我想保留錯(cuò)誤并將其添加到字符串中(在散列位置)。結(jié)果應(yīng)在控制臺(tái)上返回一個(gè)字符串,如:fileXYZ||hash不幸的是,程序在某個(gè)時(shí)候掛起。我猜我的一些頻道沒(méi)有正確關(guān)閉并無(wú)限期地等待輸入。我已經(jīng)嘗試了很長(zhǎng)時(shí)間來(lái)解決這個(gè)問(wèn)題,但沒(méi)有成功。有誰(shuí)知道為什么輸出掛起?很多人提前感謝,也歡迎對(duì) Go 新手的任何輸入/建議 ;-)。(我編寫(xiě)了單獨(dú)的函數(shù),因?yàn)槲蚁朐诮鉀Q此問(wèn)題后添加其他功能。)非常感謝!迪迪埃這是代碼:import (    "crypto/sha256"    "encoding/hex"    "flag"    "fmt"    "io"    "log"    "os"    "path/filepath"    "time")func main() {    pathParam := flag.String("path", ".", "Enter Filesystem Path to list folders")    flag.Parse()    start := time.Now()    run(*pathParam)    elapsed := time.Since(start)    log.Printf("Time elapsed: %v", elapsed)}func run(path string) {    chashes := make(chan string, 50)    cfiles := make(chan string)    go func() {        readfs(path, cfiles)        defer close(cfiles)    }()    go func() {        generateHash(cfiles, chashes)    }()    defer close(chashes)    for hash := range chashes {        fmt.Println(hash)    }}func readfs(path string, cfiles chan string) {    files, err := os.ReadDir(path)    if err != nil {        log.Fatalln(err)    }    for _, file := range files {        filename := filepath.Join(path, file.Name())        if file.IsDir() {            readfs(filename, cfiles)            continue        } else {            cfiles <- filename        }    }}func generateHash(cfiles chan string, chashes chan string) {    for filename := range cfiles {        go func(filename string) {            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()
查看完整描述

1 回答

?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

以下循環(huán)掛起,因?yàn)閏hashes未關(guān)閉。


for hash := range chashes {

    fmt.Println(hash)

}

chashes在所有哈希器完成后通過(guò)關(guān)閉來(lái)修復(fù)。使用 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()。

在 Go 操場(chǎng)上運(yùn)行一個(gè)示例。



查看完整回答
反對(duì) 回復(fù) 2022-10-31
  • 1 回答
  • 0 關(guān)注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)