Golang的embed功能有计划支持写入操作吗

Golang的embed功能有计划支持写入操作吗 embed 有计划支持写入操作吗?

我对相对二进制文件的嵌入式文件系统文件进行了修改。

2 回复

如果我的理解正确,您希望使用“embed”向嵌入Go二进制文件中的文件进行写入。如果您希望写入的内容在重启后仍然保留,您的代码需要直接写入二进制可执行文件。我认为由于多种原因,这不太可能实现。通常,操作系统会对当前正在执行的二进制文件进行读锁定——因此在程序执行期间,您无法更改其二进制文件。此外,根据环境的不同,写入二进制文件可能会破坏二进制文件上的任何签名。

如果您只是想向内存中的文件写入,这应该是可能的,可以通过使用一个在内存中保存写入操作的缓存层来实现。您可能也可以用几行代码创建自己的解决方案,将嵌入文件系统的更改写入到与二进制文件同一目录的外部文件中。在嵌入文件系统和您的代码之间设置一个小的接口,该接口在读取时会自动搜索此文件以获取持久化的更改。

更多关于Golang的embed功能有计划支持写入操作吗的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


目前,Go的embed功能仅支持只读操作,官方尚未有支持写入操作的计划。embed.FS类型被设计为不可变的,其方法集合中不包含任何写入方法。

如果你需要修改嵌入的文件,可以将其内容复制到可写的文件系统中进行操作。例如:

package main

import (
    "embed"
    "io/fs"
    "os"
)

//go:embed config/*
var configFS embed.FS

func main() {
    // 读取嵌入文件
    data, err := configFS.ReadFile("config/app.yaml")
    if err != nil {
        panic(err)
    }

    // 写入到临时文件进行修改
    tmpFile, err := os.CreateTemp("", "modified-*.yaml")
    if err != nil {
        panic(err)
    }
    defer os.Remove(tmpFile.Name())

    if _, err := tmpFile.Write(data); err != nil {
        panic(err)
    }
    tmpFile.Close()

    // 现在可以对tmpFile.Name()进行读写操作
}

对于需要动态修改的场景,建议将embed作为默认配置的只读来源,实际运行时使用可写的文件系统路径。

回到顶部