[Golang] Embed File in String Literal
Embed any type of file, no matter it is data/assets/resources/binary/etc., in string literal in Go code.
When I tried googling to find the way to embed files directly in Go code, I found that if we combine the string literal with encoding/hex package in Go standard library, we can embed any type of file in Go code.
The first step is to convert the byte sequences of a file to hex value:
import (
"encoding/hex"
"io/ioutil"
)
func FileToStringLiteral(filepath string) (sl string, err error) {
bs, err := ioutil.ReadFile(filepath)
if err != nil {
return
}
sl = hex.EncodeToString(bs)
return
}
I create a file, the content of which is hello world\n, the hex value returned by above method is 68656c6c6f20776f726c640a. Now we embed the file content in string literal as follows:
import (
"encoding/hex"
)
const myFile = "68656c6c6f20776f726c640a"
func ReadMyFile() ([]byte, error) {
return hex.DecodeString(myFile)
}
We can access the content of the file as follows:
b, err := ReadMyFile()
if err != nil {
panic(err)
}
print(string(b))
The printed output will be hello world\n.
Tested on: Ubuntu Linux 17.04, Go 1.8.1.
References:
[1] |
[2] |
[3] | String literals - The Go Programming Language Specification - The Go Programming Language |
[4] | What is a string? - Strings, bytes, runes and characters in Go - The Go Blog |
[5] |
[6] | hex - The Go Programming Language |
[7] | GitHub - siongui/goef: Embed file in your Go code |
[8] | static file embedding, modules, and non-developers : golang |