You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:09:03