能否将Go embed嵌入的文件以文件名字符串形式提供给第三方函数使用?
解决方案
这个需求可以实现,最通用的实现方式是将嵌入的文件内容写入系统临时文件,再将临时文件的字符串路径传给目标函数。
方案1:临时文件方案(兼容性最好,无需修改依赖)
实现逻辑:
- 读取embed嵌入的文件内容
- 在系统临时目录创建临时文件,将嵌入内容写入该文件
- 将临时文件的路径(字符串类型)传入目标函数调用
- 函数执行完成后删除临时文件避免占用磁盘空间
示例代码:
package main import ( "embed" "os" "github.com/melbahja/goph" ) //go:embed 你要嵌入的密钥文件名 var keyContent []byte // 也可以用embed.FS读取对应文件内容 func main() { // 创建临时文件 tmpFile, err := os.CreateTemp("", "ssh-key-*") if err != nil { panic(err) } // 调用完成后自动删除临时文件 defer os.Remove(tmpFile.Name()) // 写入嵌入的密钥内容 if _, err = tmpFile.Write(keyContent); err != nil { panic(err) } // 关闭文件句柄保证后续读取正常 if err = tmpFile.Close(); err != nil { panic(err) } // 传入临时文件路径调用目标函数 key, err := goph.Key(tmpFile.Name(), "你的密钥密码(无密码则传空字符串)") if err != nil { panic(err) } // 后续正常使用key即可 }
方案2:修改依赖适配(适合不想生成临时文件的场景)
如果可以修改目标依赖库的源码,可以为goph.Key函数新增支持[]byte类型密钥内容的重载方法,直接传入嵌入的文件内容即可,不需要经过本地文件中转。
为什么不能直接用embed的虚拟路径?
embed提供的路径是Go运行时维护的虚拟文件系统路径,仅支持Go标准库fs相关接口读取,操作系统层面无法识别该路径,而goph.Key底层是调用系统IO接口读取文件,因此无法直接读取embed的虚拟文件。
内容的提问来源于stack exchange,提问作者WoJ
相关产品推荐
相关产品推荐

