Try it yourself with our free Toml Formatter tool — runs entirely in your browser, no signup needed.

How to Parse TOML in Go

How to parse TOML in Go

TOML (Tom's Obvious, Minimal Language) is a popular configuration file format used by many applications. As a Go developer, you may need to parse TOML files to read configuration data or settings. In this article, we'll explore how to parse TOML in Go, covering the basics, handling edge cases, common mistakes, and performance tips.

Quick Example

Here's a minimal example that demonstrates how to parse a TOML file in Go:

package main

import (
	"fmt"
	"log"

	"github.com/BurntSushi/toml"
)

type Config struct {
	Server   Server   `toml:"server"`
	Database Database `toml:"database"`
}

type Server struct {
	Address string `toml:"address"`
	Port    int    `toml:"port"`
}

type Database struct {
	Username string `toml:"username"`
	Password string `toml:"password"`
}

func main() {
	var config Config
	_, err := toml.DecodeFile("config.toml", &config)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(config.Server.Address, config.Database.Username)
}

To use this code, install the github.com/BurntSushi/toml package using the following command:

go get github.com/BurntSushi/toml

This example assumes a config.toml file with the following contents:

[server]
address = "localhost"
port = 8080

[database]
username = "admin"
password = "secret"

Step-by-Step Breakdown

Let's walk through the code:

  1. We import the github.com/BurntSushi/toml package, which provides the toml function for parsing TOML files.
  2. We define a Config struct to hold the parsed configuration data. The struct fields are annotated with TOML tags to specify the corresponding keys in the TOML file.
  3. In the main function, we create a Config instance and use the toml.DecodeFile function to parse the config.toml file into the config struct.
  4. We handle any errors that occur during parsing using the log.Fatal function.
  5. Finally, we print the parsed configuration data to the console.

Handling Edge Cases

Here are some common edge cases to consider when parsing TOML files in Go:

Empty/Null Input

If the input TOML file is empty or null, the toml.DecodeFile function will return an error. You can handle this case by checking the error value:

_, err := toml.DecodeFile("config.toml", &config)
if err != nil {
	if err == toml.ErrEmptyInput {
		log.Println("Input file is empty")
	} else {
		log.Fatal(err)
	}
}

Invalid Input

If the input TOML file contains invalid syntax or data types, the toml.DecodeFile function will return an error. You can handle this case by checking the error value:

_, err := toml.DecodeFile("config.toml", &config)
if err != nil {
	if _, ok := err.(*toml.SyntaxError); ok {
		log.Println("Invalid TOML syntax")
	} else {
		log.Fatal(err)
	}
}

Large Input

If the input TOML file is very large, you may need to use a streaming parser to avoid loading the entire file into memory. The github.com/BurntSushi/toml package provides a toml.NewDecoder function for this purpose:

file, err := os.Open("config.toml")
if err != nil {
	log.Fatal(err)
}
defer file.Close()

decoder := toml.NewDecoder(file)
err = decoder.Decode(&config)
if err != nil {
	log.Fatal(err)
}

Unicode/Special Characters

TOML files can contain Unicode characters and special characters. The github.com/BurntSushi/toml package supports these characters out of the box, so you don't need to do anything special to handle them.

Common Mistakes

Here are some common mistakes developers make when parsing TOML files in Go:

Wrong TOML Tags

Using the wrong TOML tags on struct fields can cause the parser to ignore the corresponding data. Make sure to use the correct tags:

// Wrong
type Config struct {
	Server   Server   `json:"server"`
	Database Database `json:"database"`
}

// Correct
type Config struct {
	Server   Server   `toml:"server"`
	Database Database `toml:"database"`
}

Missing TOML Tags

Omitting TOML tags on struct fields can cause the parser to ignore the corresponding data. Make sure to include the tags:

// Wrong
type Config struct {
	Server   Server
	Database Database
}

// Correct
type Config struct {
	Server   Server   `toml:"server"`
	Database Database `toml:"database"`
}

Incorrect Data Types

Using the wrong data types for struct fields can cause the parser to return errors. Make sure to use the correct data types:

// Wrong
type Config struct {
	Server   string `toml:"server"`
	Database int    `toml:"database"`
}

// Correct
type Config struct {
	Server   Server   `toml:"server"`
	Database Database `toml:"database"`
}

Performance Tips

Here are some performance tips for parsing TOML files in Go:

  1. Use a streaming parser: If you need to parse large TOML files, use a streaming parser like toml.NewDecoder to avoid loading the entire file into memory.
  2. Use a cache: If you need to parse the same TOML file multiple times, consider using a cache to store the parsed data.
  3. Avoid unnecessary parsing: Only parse the TOML file when necessary, and avoid parsing it unnecessarily.

FAQ

Q: What is the best way to handle errors when parsing TOML files in Go?

A: Use the log.Fatal function to handle fatal errors, and use error checking to handle non-fatal errors.

Q: Can I use the github.com/BurntSushi/toml package with Go modules?

A: Yes, the github.com/BurntSushi/toml package is compatible with Go modules.

Q: How do I parse a TOML file with a non-standard extension?

A: You can use the toml.DecodeFile function with the non-standard extension, or use the toml.Decode function with a bytes.Reader instance.

Q: Can I use the github.com/BurntSushi/toml package with Go 1.10 or earlier?

A: No, the github.com/BurntSushi/toml package requires Go 1.11 or later.

Q: How do I report a bug or issue with the github.com/BurntSushi/toml package?

A: Open an issue on the GitHub repository or submit a pull request with a fix.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp