如何在Golang中把文件的内容嵌入到一个变量中

257 阅读2分钟

这篇文章中,我们讨论了如何在Golang中处理一个大文件。但你有没有遇到过这样的情况:只是想读取一个文件,并把它的全部内容加载到一个变量中,然后对其进行处理?我也经常遇到这样的情况。例如,从一个文件中读取一个特定的配置,而不知为何,这个文件总是在那里!我的意思是,你知道你需要那个文件。我是说你知道你需要这个文件来构建/运行你的应用程序。让我们用代码来谈一谈,设想我们有一个名为config.txt 的文件,内容如下:

I am a file that you need me ;)

并且想要读取这个文件:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
)

func main() {
    file, err := os.Open("config.txt")
    if err != nil {
        log.Fatalf("missing config file: %v", err)
    }
    content, err := ioutil.ReadAll(file)
    if err != nil {
        log.Fatalf("could not read config file: %v", err)
    }
    fmt.Println(string(content))
}
// output: I am a file that you need me ;)

如果上面的代码听起来很熟悉,我有个好消息要告诉你,Go提供了一个更好、更漂亮、更短的方法来做这件事。有一个叫embed的包在一行中为你做所有的事情。你所需要的只是在你的变量上方的指令中传递文件路径

package main

import (
    _ "embed"
    "fmt"
)

//go:embed config.txt
var content string

func main() {
    fmt.Print(content)
}
// output: I am a file that you need me ;)

就这样!你在content变量中得到了文件的内容!你需要把它放在[]byte 吗?你只需要改变你的变量类型:

package main

import (
    _ "embed"
    "fmt"
)

//go:embed config.txt
var content []byte

func main() {
    fmt.Print(content)
}
// output: [73 32 97 109 32 97 32 102 105 108 101 32 116 104 97 116 32 121 111 117 32 110 101 101 100 32 109 101 32 59 41]