gpt4 book ai didi

go - 什么时候使用嵌入?

转载 作者:行者123 更新时间:2023-12-04 12:04:45 26 4
gpt4 key购买 nike

从 Go 1.16 开始,我们有 embed指示。它帮助我们将额外的文件(例如 .txt 文件)嵌入到可执行文件中,而无需额外提供该文件。 (引用,here)。
我不太了解解释“额外文件”的内容。所有文件都不是以 .go 结尾吗?被解释为额外的文件?有什么异常(exception)吗?
我想将二进制 protobuf 定义文件作为主二进制文件的一部分发送,以便我的代码可以读取它。这个文件会是一个额外的文件吗?或者它会成为主二进制文件本身的一部分?

最佳答案

通常情况下,正在运行的 Go 程序无权访问编译该程序的文件系统目录。
嵌入功能在构建时将包源代码树中的文件合并起来,并使这些文件在运行时可用。
包应该从包源代码树中嵌入包需要在运行时访问的文件。
下面是一个例子:一个包 foo 有源文件 foo.go。包需要访问foo.go所在目录下的abc.txt文件。
如果current working directory是源代码代码目录,那么包代码可以使用 os.Open 或任何调用 os.Open 的东西访问该文件:

  f, err := os.Open("abc.txt")
if err != nil {
// handle error
}
defer f.Close()
// do something with f
此代码可能会失败。运行时的当前工作目录不一定与包源代码目录相同。它通常不是同一个目录。包源目录甚至可能对正在运行的应用程序不可用。
在这种情况下,包应该嵌入文件以确保包可以访问文件的内容:
//go:embed abc.txt
var abc []byte

关于go - 什么时候使用嵌入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68012429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com