Code Generation and Embedding

Overview

go generate runs commands to generate code, and //go:embed embeds files into binaries.

go generate

//go:generate stringer -type=Status

type Status int

const (
    Pending Status = iota
    Approved
    Rejected
)
go generate ./...

Common Generators

  • stringer - String methods for enums
  • mockgen - Mock interfaces for testing
  • protoc - Protocol buffer code

Embedding Files

import "embed"

//go:embed config.json
var configData []byte

//go:embed templates/*
var templates embed.FS

//go:embed static
var staticFiles embed.FS

Reading Embedded Files

//go:embed data.txt
var data string  // As string

//go:embed data.bin
var data []byte  // As bytes

//go:embed files/*
var fs embed.FS  // As filesystem

content, _ := fs.ReadFile("files/config.json")

HTTP File Server

//go:embed static/*
var static embed.FS

func main() {
    fs := http.FileServer(http.FS(static))
    http.Handle("/static/", fs)
    http.ListenAndServe(":8080", nil)
}

Templates

//go:embed templates/*.html
var templates embed.FS

tmpl := template.Must(template.ParseFS(templates, "templates/*.html"))

Summary

Directive Purpose
//go:generate cmd Run code generator
//go:embed file Embed as string/bytes
//go:embed dir/* Embed as filesystem