How to Generate a Random Token in Go (Golang)

In the Go language, you can use the crypto/rand package to generate secure random numbers for creating a token generator. Here is an example of a Go function:

package main

import (
	"crypto/rand"
	"fmt"
)

// GenerateToken generates a secure token with the given length and character set options.
func GenerateToken(length int, options map[string]bool) (string, error) {
	var charset string
	uppercase := options["uppercase"]
	lowercase := options["lowercase"]
	numbers := options["numbers"]

	if uppercase {
		charset += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	}
	if lowercase {
		charset += "abcdefghijklmnopqrstuvwxyz"
	}
	if numbers {
		charset += "0123456789"
	}

	if charset == "" {
		return "", fmt.Errorf("at least one character set must be selected")
	}

	token := make([]byte, length)
	for i := range token {
		b, err := rand.ReadByte()
		if err != nil {
			return "", err
		}
		token[i] = charset[b%byte(len(charset))]
	}

	return string(token), nil
}

func main() {
	// Example usage:
	options := map[string]bool{
		"uppercase": true,
		"lowercase": true,
		"numbers":   true,
	}
	token, err := GenerateToken(16, options)
	if err != nil {
		fmt.Println("Error generating token:", err)
		return
	}
	fmt.Println("Generated token:", token)
}

In this Go function, GenerateToken accepts two parameters: length (the length of the token) and an options of type map[string]bool, which contains the configuration for whether to include uppercase letters, lowercase letters, and numbers. Inside the function, a character set charset is constructed, and then the ReadByte function from the crypto/rand package is used to generate secure random bytes. For each character of the token, a random byte is generated and used to select a character from charset.

Please note that the random number generator provided by the crypto/rand package is cryptographically secure and suitable for scenarios requiring high security. This function returns a string and an error value when generating a token; if the random byte generation fails, an error is returned. In the main function, we provide an example usage and print the generated token.