Golang : Embedded or data bundling example
Golang complies your source code into a single executable file that allows your program end users to deploy the executable at target machine with ease. However, there are times when the executable needs to load external resources such as images or HTML templates to function properly (such as showing a splash screen) and this can make the downloading process cumbersome for your end users.
Other motivations could be that you want to optimize your Golang program execution time and do not want to slow down by loading external resource or you do not want your end users to modify the images or HTML templates that your program depends on.
There are couple of ways to put everything(embed/bundle) into a single executable file instead of having multiple files. Depending on your resources, the technique to handle text data for example, can be done with this method :
textData = `this is an example of bundling
text data in your program executable`
to print, use fmt.Println(textData)
As for bundling image, convert the image into base64 string ( see full example at encode image to base64 tutorial )
imgFile, err := os.Open("QrImgGA.png") // a QR code image
....
// convert the buffer bytes to base64 string - use buf.Bytes() for new image
imgBase64Str := base64.StdEncoding.EncodeToString(buf)
fmt.Println(imgBase64Str)
then you can store the imgBase64Str
string directly inside your source code and decode it back during runtime for display
imgFile, err := base64.StdEncoding.DecodeString(imgBase64Str)
or if your program is displaying the base64 encoded image directly to browser, then do this instead :
// Embed into an html without PNG file
img2html := "<html><body><img src=\"data:image/png;base64," + imgBase64Str + "\" /></body></html>"
Another option that you might want to explore is to use the go-bindata command line tool :
https://github.com/jteeuwen/go-bindata
Go-bindata converts any static file into a byte slice that can be embedded in your code.
NOTE :
Bear in mind that by bundling/embedding resource data into your executable might cause it to become large and also hard to debug/maintain in future by other people. Back in my old tech support days, I have to request help from the development team to look at the source code (written in C) for a very strange error message caused by bundled resource. Not an easy task if the original developer left the organisation long time ago and there's no written document on which resources are embedded in the executable.
References :
https://github.com/jteeuwen/go-bindata
https://www.socketloop.com/tutorials/golang-encode-image-to-base64-example
https://www.socketloop.com/tutorials/golang-web-javascript-to-server-side-websocket-example
See also : Golang : How to protect your source code from client, hosting company or hacker?
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+13.6k Golang : How to check if a file is hidden?
+15.8k Golang : How to check if input from os.Args is integer?
+9.1k Golang : Create unique title slugs example
+9.2k Golang : Qt Yes No and Quit message box example
+13.2k Golang : Get constant name from value
+14k Golang : Convert IP version 6 address to integer or decimal number
+16.1k Golang : Convert slice to array
+8.5k Yum Error: no such table: packages
+11k Golang : How to pipe input data to executing child process?
+31.4k Golang : Convert an image file to []byte
+9.8k Golang : Get login name from environment and prompt for password
+5.5k Golang : ROT32768 (rotate by 0x80) UTF-8 strings example