選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

40 行
937 B

  1. // Package strcase converts strings to snake_case or CamelCase
  2. package strcase
  3. import (
  4. "strings"
  5. )
  6. // Converts a string to snake_case
  7. func ToSnake(s string) string {
  8. s = addWordBoundariesToNumbers(s)
  9. s = strings.Trim(s, " ")
  10. n := ""
  11. for i, v := range s {
  12. // treat acronyms as words, eg for JSONData -> JSON is a whole word
  13. nextCaseIsChanged := false
  14. if i+1 < len(s) {
  15. next := s[i+1]
  16. if (v >= 'A' && v <= 'Z' && next >= 'a' && next <= 'z') || (v >= 'a' && v <= 'z' && next >= 'A' && next <= 'Z') {
  17. nextCaseIsChanged = true
  18. }
  19. }
  20. if i > 0 && n[len(n)-1] != '_' && nextCaseIsChanged {
  21. // add underscore if next letter case type is changed
  22. if v >= 'A' && v <= 'Z' {
  23. n += "_" + string(v)
  24. } else if v >= 'a' && v <= 'z' {
  25. n += string(v) + "_"
  26. }
  27. } else if v == ' ' {
  28. // replace spaces with underscores
  29. n += "_"
  30. } else {
  31. n = n + string(v)
  32. }
  33. }
  34. n = strings.ToLower(n)
  35. return n
  36. }