func (ini *Initialisms) ForceCamelIdentifier(name string) string {
	if name == "" {
		return ""
	}
	return ini.SnakeToCamelIdentifier(ini.CamelToSnake(name))
}
ForceCamelIdentifier forces name to its CamelCase specific to Go
("AnIdentifier").
package snaker
import (
	"fmt"
	"strings"
	"unicode"
)
type Initialisms struct {
	m   map[string]bool
	max int
}
func New(initialisms ...string) (*Initialisms, error) {
	ini := &Initialisms{
		m: make(map[string]bool),
	}
	if err := ini.Add(initialisms...); err != nil {
		return nil, err
	}
	return ini, nil
}
func (ini *Initialisms) Add(initialisms ...string) error {
	for _, s := range initialisms {
		if len(s) < 2 {
			return fmt.Errorf("invalid initialism %q", s)
		}
		ini.m[s], ini.max = true, max(ini.max, len(s))
	}
	return nil
}
func (ini *Initialisms) CamelToSnake(name string) string {
	if name == "" {
		return ""
	}
	s, r := "", []rune(name)
	var lastWasUpper, lastWasLetter, lastWasIsm, isUpper, isLetter bool
	for i := 0; i < len(r); {
		isUpper, isLetter = unicode.IsUpper(r[i]), unicode.IsLetter(r[i])
		if (lastWasLetter && isUpper) || (lastWasIsm && isLetter) {
			s += "_"
		}
		var next string
		if ism := ini.Peek(r[i:]); ism != "" && (!lastWasUpper || lastWasIsm) {
			next = ism
		} else {
			next = string(r[i])
		}
		lastWasIsm, lastWasUpper, lastWasLetter = len(next) > 1, isUpper, isLetter
		s += next
		i += len(next)
	}
	return strings.ToLower(s)
}
func (ini *Initialisms) CamelToSnakeIdentifier(name string) string {
	return ToIdentifier(ini.CamelToSnake(name))
}
func (ini *Initialisms) SnakeToCamel(name string) string {
	var s string
	for _, word := range strings.Split(name, "_") {
		if word == "" {
			continue
		}
		u := strings.ToUpper(word)
		if ok := ini.m[u]; ok {
			s += u
		} else {
			s += strings.ToUpper(word[:1]) + strings.ToLower(word[1:])
		}
	}
	return s
}
func (ini *Initialisms) SnakeToCamelIdentifier(name string) string {
	return ini.SnakeToCamel(ToIdentifier(name))
}