SoFunction
Updated on 2025-03-05

Go generate code automatic generation guide

In the Go language, there is a powerful and magical tool - the go generate command, which can automatically generate some code before compiling the code to achieve automated tasks.

1. go generate command

In Go, go generate is a command used to run code generation tools. By adding the //go:generate comment in the code, you can specify the commands you need to run and generate the required code before compilation.

2. Basic usage

2.1 Basic command structure:

The basic command structure of go generate. Run the following command in the project root directory

go generate ./...

The above command will execute all commands with the //go:generate annotation in the project.

2.2 Automatically generate constants

Consider a scenario where you need to define some constants in your code, which are generated based on a set of rules. These constants can be generated automatically using go generate.

Create a file named

// go:generate go run generate_constants.go
package main
// Go generates constantsconst (
    Monday = iota + 1
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
)

Then, create a file called generate_constants.go to use the code to actually generate constants

    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
)
`
  // Create or overwrite files  file, err := ("")
  if err != nil {
    ("Error creating  file:", err)
    return
  }
  defer ()
  // Write the generated code to a file  _, err = (constantsTemplate)
  if err != nil {
    ("Error writing to  file:", err)
    return
  }
  ("Constants generated successfully.")
}

Execute the following command to generate constant code

go generate ./...

This will generate constants in the file.

2.3 Use the go:generate directive

In addition to triggering the generation command through the //go:generate comment, the //go:generate directive can also be used in the code.

Consider the following example and add the following code to the file

// go:generate go run generate_data.go
package main
func main() {
    // Main code
}

Then, create a file called generate_data.go for the code that actually generates the data

package main
import (
  "fmt"
  "os"
)
func main() {
  data := "Generated data for the application."
  // Create or overwrite files  file, err := ("")
  if err != nil {
    ("Error creating  file:", err)
    return
  }
  defer ()
  // Write the generated data to a file  _, err = (data)
  if err != nil {
    ("Error writing to  file:", err)
    return
  }
  ("Data generated successfully.")
}

Execute the following command to generate the data file

go generate ./...

This will generate data in the file.

3. Analysis of the principle of go generate

3.1 AST (Abstract Syntax Tree) Abstract Syntax Tree

Before you dig deeper into the principles of go generate, you need to understand AST, namely Abstract Syntax Tree.

AST is a tree-like representation of the source code, and each node represents a part of the source code. In Go, the go/ast package provides support for AST.

3.2 Analysis //go:generate comment

When running the go generate command, the Go compiler first parses the part of the source code with the //go:generate annotation.

These comments usually contain commands to generate the code.

3.3 Execution process for generating code

  • The Go compiler parses the source code and finds all the parts with the //go:generate annotation.
  • For each comment, the Go compiler executes the command specified in the comment, which can be an executable file, a Go program, etc.
  • The generated code is added to the source code.
  • Ultimately, the compiler compiles the complete source code that contains the generated code.

4. Practical application scenarios

4.1 Automatically generate API documents

In the Go language, the godoc tool is often used to generate code documents. By combining go generate, API documents can be generated automatically.

Consider the following example, add the following code in

// Generate go documentpackage main
func main() {
    // Main code
}

Execute the following command to generate the API document

go generate ./...

This will generate the document using the godoc tool.

4.2 Automatically generate code

Sometimes, a large amount of code needs to be automatically generated based on some rules. go generate can help achieve this.

Assuming that corresponding database query methods need to be automatically generated based on a set of structures, go generate code for these methods can be used.

In the file, add the following code

// go:generate go run generate_queries.go
package main
type User struct {
    ID   int
    Name string
}
type Product struct {
    ID    int
    Name  string
    Price float64
}

Next, create a file named generate_queries.go to use the code to actually generate the database query method.

package main
import (
  "fmt"
  "os"
  "text/template"
)
func main() {
queriesTemplate 
:= `// Code generated by go generate; DO NOT EDIT.
package main
import "database/sql"
// Query with primary key IDfunc (u *User) QueryByID(db *) error {
    // Implementation of the query logic
    return nil
}
// Query by namefunc (u *User) QueryByName(db *) error {
    // Implementation of the query logic
    return nil
}
// Press ID to query the productfunc (p *Product) QueryByID(db *) error {
    // Implementation of the query logic
    return nil
}
// Query the product by namefunc (p *Product) QueryByName(db *) error {
    // Implementation of the query logic
    return nil
}
`
  // Create or overwrite files  file, err := ("")
  if err != nil {
    ("Error creating  file:", err)
    return
  }
  defer ()
  // Write the generated code to a file  _, err = (queriesTemplate)
  if err != nil {
    ("Error writing to  file:", err)
    return
  }
  ("Queries generated successfully.")
}

Execute the following command to generate the code for the database query method

go generate ./...

This will generate the corresponding code in the file.

4.3 Other creative applications

In addition to the above applications, go generate can also be applied to many other creative scenarios, such as generating protocol implementations, creating test data, etc. The specific application depends on the project's needs and the developer's creativity.

5. Precautions and FAQs

Avoid circular dependencies

When using go generate, be careful to avoid circular dependencies. The generated code may introduce new dependencies and therefore needs to be handled with caution.

Understand the generated code location

The generated code will be placed in the same directory as the source code by default. If you need to place the generated code in a different directory, you can specify the location using a relative or absolute path in the generated code.

Handle go generate error message

When an error occurs during the execution of go generate, you should carefully review the error message so that the problem can be fixed in a timely manner. Error messages usually indicate the error file and line number, which facilitates positioning problems.

Summarize

With the go:generate command, Go provides developers with a powerful and flexible tool that makes code generation a breeze.

In actual projects, clever use of go:generate can improve the maintainability and readability of the code and accelerate the development process.

I hope this article can help readers better understand and use the go:generate command, providing more convenience for Go language development. For more information about the automatic generation of go generate code, please follow my other related articles!