golang使用io包和os包代替ioutil.ReadAll

ioutil.ReadAll方法从Go1.16版本开始就被弃用了,原因是在写入大文件时会因为内存原因导致出错,Go1.16版本后推荐使用io包和os包来代替ioutil.ReadAll方法

使用ioutil.ReadAll方法

// 读取配置文件
    bytes, err := ioutil.ReadFile("conf.json")
    if err != nil {
        fmt.Println("Failed to read config file:", err)
        return
    }

使用io包和os包代替

// 读取配置文件
file, err := os.Open("conf.json")
if err != nil {
    fmt.Println("Failed to open config file:", err)
    return
}
defer file.Close()

// 获取文件大小
stat, err := file.Stat()
if err != nil {
    fmt.Println("Failed to get file size:", err)
    return
}

// 分配足够的空间来存储文件内容
bytes := make([]byte, stat.Size())

// 读取文件内容
_, err = io.ReadFull(file, bytes)
if err != nil {
    fmt.Println("Failed to read file:", err)
    return
}

读取http body

var req conf.ExReq
var body []byte
var err error
if r.ContentLength > 0 {
    body = make([]byte, r.ContentLength)
    _, err = io.ReadFull(r.Body, body)
    if err != nil {
        fmt.Println("Failed to read request body:", err)
        return
    }
}
// 解析响应数据
err = json.Unmarshal(body, &req)
if err != nil {
    fmt.Println("Failed to unmarshal response data:", err)
    return
}

改变为Buffer类型

// 创建一个 bytes.Buffer 用于存储文件内容
    buffer := &bytes.Buffer{}

    // 将文件内容拷贝到 bytes.Buffer
    _, err = io.Copy(buffer, file)
    if err != nil {
        fmt.Println("无法拷贝文件内容:", err)
        return
    }

    // 现在 buffer 中包含了文件内容
    fmt.Println("文件内容:", buffer.String())
}

Sitemap · Rss

津ICP备2021004480号-3