Scan or generate QR code with Go language
In this tutorial, we will create a program in Golang which can read an image file as input and write the text to standard output.
What exactly is QR code?
QR code or Quick Response code is a type of matrix or two dimensional (2D) barcode developed in 1994 that can be read easily by a digital machine/device, such as a cell phone, and which stores information as a series of pixels in a square-shaped grid.
Follow these steps to write a program which could read and generate QR code purely with Go language:
Make sure you have installed Golang and properly set up the environment variable. Check out Golang installation tutorial here.
1. Start by creating a file main.go and import the required Golang packages:
	- fmt- To print extracted html comments.
- os- To read HTML files from standard input (stdin)
- image- Read an image file.
- io/ioutil- impliments package input output utility functions.
- bytes- manipulation of byte slices
- image/png- write encoded QR code to a PNG image binary file.
- github.com/boombuler/barcode- a barcode creation library. (here used to scale the code.)
- github.com/boombuler/barcode/qr- a qr code creation library
- github.com/liyue201/goqr- QR Code recognition and decoding
package main
import (
	"image/png"
	"os"
	"image"
	"io/ioutil"
	"bytes"
	"fmt"
	// github. com liyue201 GOQR
	"github.com/liyue201/goqr"
	// barcode scale 
	"github.com/boombuler/barcode"
	// Build the QRcode for the text
	"github.com/boombuler/barcode/qr"
)
2. Generate QR code from text with Go language
Import required packages.
import (
	"image/png"
	"os"
	
	// barcode scale 
	"github.com/boombuler/barcode"
	// Build the QRcode for the text
	"github.com/boombuler/barcode/qr"
)
Let's create a function which generates QR code for given string and write it to a image file.
func qrCodeGen(t string, filename string) (error) {}
Use qr.Encode() function to encode given text into a QR code.
func qrCodeGen(t string, filename string) (error) {
	// Create the barcode
	qrCode, _ := qr.Encode(t, qr.M, qr.Auto)
}
Scale the QR code to the 200*200 pixels with barcode.Scale() function.
func qrCodeGen(t string, filename string) (error) {
	// Create the barcode
	qrCode, _ := qr.Encode(t, qr.M, qr.Auto)
	// Scale the barcode to 200x200 pixels
	qrCode, _ = barcode.Scale(qrCode, 2000, 2000)
}
Create a file to write QR code to it with os.Create() function.
func qrCodeGen(t string, filename string) (error) {
	// Create the barcode
	qrCode, _ := qr.Encode(t, qr.M, qr.Auto)
	// Scale the barcode to 200x200 pixels
	qrCode, _ = barcode.Scale(qrCode, 2000, 2000)
	// create the output file
	file, err := os.Create(filename)
	defer file.Close()
}
Write the encoded image into a PNG image file with png.Encode() function.
func qrCodeGen(t string, filename string) (error) {
	// Create the barcode
	qrCode, _ := qr.Encode(t, qr.M, qr.Auto)
	// Scale the barcode to 200x200 pixels
	qrCode, _ = barcode.Scale(qrCode, 2000, 2000)
	// create the output file
	file, err := os.Create(filename)
	defer file.Close()
	// encode the barcode as png
	png.Encode(file, qrCode)
	return err
}
Finally call the function in your code to Generate the QR code.
package main
import (
	"image/png"
	"os"
	
	// barcode scale 
	"github.com/boombuler/barcode"
	// Build the QRcode for the text
	"github.com/boombuler/barcode/qr"
)
func qrCodeGen(t string, filename string) (error) {
	// Create the barcode
	qrCode, _ := qr.Encode(t, qr.M, qr.Auto)
	// Scale the barcode to 200x200 pixels
	qrCode, _ = barcode.Scale(qrCode, 2000, 2000)
	// create the output file
	file, err := os.Create(filename)
	defer file.Close()
	// encode the barcode as png
	png.Encode(file, qrCode)
	return err
}
func main() {
	
	// This is a text to encode
	t := "This is a text"
	// file to read from 
	filenameR := "qrcode.png"
	// qrCodeGen generates a QR Code
	qrCodeGen(t, filenameR)
}
3. Scan QR code - Go language
Import required packages.
package main
import (
	"image"
	"io/ioutil"
	"bytes"
	"fmt"
	// github. com liyue201 GOQR
	"github.com/liyue201/goqr"
)
Let's create a function to scan provided file, as a path, for QR code and extract text out of it.
func scanQRCode(path string) {}
Read the provided file (path) with ioutil.ReadFile() function.
func scanQRCode(path string) {
	
	// Reads imgdata from a file.
	imgdata, err := ioutil.ReadFile(path)
	if err != nil {
		fmt.Printf("%v\n", err)
		return
	}
}
Try to decode the file as image:
func scanQRCode(path string) {
	
	// Reads imgdata from a file.
	imgdata, err := ioutil.ReadFile(path)
	if err != nil {
		fmt.Printf("%v\n", err)
		return
	}
	// Decodes an image.
	img, _, err := image.Decode(bytes.NewReader(imgdata))
	if err != nil {
		fmt.Printf("image.Decode error: %v\n", err)
		return
	}
}
Check if any QR code exist in the provided image.
func scanQRCode(path string) {
	
	// Reads imgdata from a file.
	imgdata, err := ioutil.ReadFile(path)
	if err != nil {
		fmt.Printf("%v\n", err)
		return
	}
	// Decodes an image.
	img, _, err := image.Decode(bytes.NewReader(imgdata))
	if err != nil {
		fmt.Printf("image.Decode error: %v\n", err)
		return
	}
	// Recognize QR Codes.
	qrCodes, err := goqr.Recognize(img)
	if err != nil {
		fmt.Printf("Recognize failed: %v\n", err)
		return
	}
}
Extract data from the image and print it to standard output.
func scanQRCode(path string) {
	
	// Reads imgdata from a file.
	imgdata, err := ioutil.ReadFile(path)
	if err != nil {
		fmt.Printf("%v\n", err)
		return
	}
	// Decodes an image.
	img, _, err := image.Decode(bytes.NewReader(imgdata))
	if err != nil {
		fmt.Printf("image.Decode error: %v\n", err)
		return
	}
	// Recognize QR Codes.
	qrCodes, err := goqr.Recognize(img)
	if err != nil {
		fmt.Printf("Recognize failed: %v\n", err)
		return
	}
	
	// Prints a list of QR Codes.
	for _, qrCode := range qrCodes {
		fmt.Printf("qrCode text: %s\n", qrCode.Payload)
	}
	return
}
Finally, call the function in your code and provide the image file to decode.
package main
import (
	"image"
	"io/ioutil"
	"bytes"
	"fmt"
	// github. com liyue201 GOQR
	"github.com/liyue201/goqr"
)
func scanQRCode(path string) {
	
	// Reads imgdata from a file.
	imgdata, err := ioutil.ReadFile(path)
	if err != nil {
		fmt.Printf("%v\n", err)
		return
	}
	// Decodes an image.
	img, _, err := image.Decode(bytes.NewReader(imgdata))
	if err != nil {
		fmt.Printf("image.Decode error: %v\n", err)
		return
	}
	// Recognize QR Codes.
	qrCodes, err := goqr.Recognize(img)
	if err != nil {
		fmt.Printf("Recognize failed: %v\n", err)
		return
	}
	
	// Prints a list of QR Codes.
	for _, qrCode := range qrCodes {
		fmt.Printf("qrCode text: %s\n", qrCode.Payload)
	}
	return
}
func main() {
	
	// file to write to
	filenameW := "qrcode.png"
	// scanQRCode scans a QR code image file.
	scanQRCode(filenameW)
}
 
Conclusion
In this tutorial, we used Golang to write a program which can encode or decode QR code image files. You can modify the code to use other types of bar codes.