Более быстрая и простая версия:
import "bytes"
func SnakeCase(camel string) string {
var buf bytes.Buffer
for _, c := range camel {
if 'A' <= c && c <= 'Z' {
// just convert [A-Z] to _[a-z]
if buf.Len() > 0 {
buf.WriteRune('_')
}
bytes.WriteRune(c - 'A' + 'a')
} else {
bytes.WriteRune(c)
}
}
return buf.String()
}
Известные ошибки: 1. no-ascii 2. перевернутое слово верхней аббревиатуры, например.baseURL будет безобразным base_u_r_l
, но не base_url
, рассмотрите возможность использования белого списка для фильтрации.