You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: reasons.go
    path of file: ./repos/podman/vendor/github.com/letsencrypt/boulder/revocation
    
    the code of the file until where you have to start completion: package revocation

import (
	"fmt"
	"sort"
	"strings"

	"golang.org/x/crypto/ocsp"
)

// Reason is used to specify a certificate revocation reason
type Reason int

// ReasonToString provides a map from reason code to string
var ReasonToString = map[Reason]string{
	ocsp.Unspecified:          "unspecified",
	ocsp.KeyCompromise:        "keyCompromise",
	ocsp.CACompromise:         "cACompromis
    
func init() {
	// Build a slice of ints from the allowed reason codes.
	// We want a slice because iterating `UserAllowedReasons` will change order
	// and make the message unpredictable and cumbersome for unit testing.
	// We use []ints instead of []Reason to use `sort.Ints` without fuss.
	var allowed []int
	for reason := range UserAllowedReasons {
		allowed = append(allowed, int(reason))
	}
	sort.Ints(allowed)

	var reasonStrings []string
	for _, reason := range allowed {
		reasonStrings = append(reasonStrings, fmt.Sprintf("%s (%d)",
			ReasonToString[Reason(reason)], reason))
	}
	UserAllowedReasonsMessage = strings.Join(reasonStrings, ", ")
}