首页 > 解决方案 > 为什么 ioutil.ReadFile() 在 for 循环中被调用后挂起?

问题描述

我编写了一个将图像转换为 base64 字符串的函数:

func getBase64Screenshot() string {
    // Image name
    imageName := "Screenshots/screenshot.png"

    imageFileBytes, err := ioutil.ReadFile(imageName)
    handleError(err)

    // Converts file to base64 string
    encoded := base64.StdEncoding.EncodeToString(imageFileBytes)

    return encoded
}

上面的函数在 a 中调用for loop,但是在 for 循环的一些迭代之后,程序只是挂在了行上imageFileBytes, err := ioutil.ReadFile(imageName)(它不会抛出错误,它只是停止运行并停止)。

我进行了一些实验,发现如果我使用较小的图像,它将通过大约 5 次for loop停止前的迭代,但是如果我截取整个屏幕,它只会通过for loop停止前的第一次迭代。

我的问题是:是什么导致程序挂起,我能做些什么来防止它挂起?

谢谢!

标签: imagefilegoio

解决方案


调试你的代码。


试试这个,让我知道这是否也适合你:
这对我来说就像在 Linux 上的魅力:

package main

import (
    "encoding/base64"
    "fmt"
    "io/ioutil"
    "log"
    "os"
)

func main() {
    for i := 0; i < 10; i++ {
        fmt.Println(getBase64Screenshot()[:10])
    }
}
func getBase64Screenshot() string {
    buf, err := ioutil.ReadFile(os.Args[0])
    if err != nil {
        log.Fatal(err)
    }
    encoded := base64.StdEncoding.EncodeToString(buf)
    return encoded
}

输出:

time go run main.go
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ
f0VMRgIBAQ

real    0m0.340s
user    0m0.369s
sys     0m0.128s

推荐阅读