package util // https://github.com/go-pg/pg/blob/7c2d9d39a5cfc18a422c88a9f5f39d8d2cd10030/internal/underscore.go func isUpper(c byte) bool { return c >= 'A' && c <= 'Z' } func isLower(c byte) bool { return !isUpper(c) } func toLower(c byte) byte { return c + 32 } // Underscore converts "CamelCasedString" to "camel_cased_string". func Underscore(s string) string { r := make([]byte, 0, len(s)) for i := 0; i < len(s); i++ { c := s[i] if isUpper(c) { if i > 0 && i+1 < len(s) && (isLower(s[i-1]) || isLower(s[i+1])) { r = append(r, '_', toLower(c)) } else { r = append(r, toLower(c)) } } else { r = append(r, c) } } return string(r) }