string.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package utils
  2. import (
  3. "bytes"
  4. "strings"
  5. )
  6. var commonInitialisms = []string{"ACL", "API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "LHS", "QPS", "RAM", "RHS", "RPC", "SLA", "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", "UDP", "UI", "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", "XSS"}
  7. var commonInitialismsReplacer *strings.Replacer
  8. var uncommonInitialismsReplacer *strings.Replacer
  9. func init() {
  10. var commonInitialismsForReplacer []string
  11. var uncommonInitialismsForReplacer []string
  12. for _, initialism := range commonInitialisms {
  13. commonInitialismsForReplacer = append(commonInitialismsForReplacer, initialism, strings.Title(strings.ToLower(initialism)))
  14. uncommonInitialismsForReplacer = append(uncommonInitialismsForReplacer, strings.Title(strings.ToLower(initialism)), initialism)
  15. }
  16. commonInitialismsReplacer = strings.NewReplacer(commonInitialismsForReplacer...)
  17. uncommonInitialismsReplacer = strings.NewReplacer(uncommonInitialismsForReplacer...)
  18. }
  19. /**
  20. 下划线 -> 驼峰
  21. */
  22. func Marshal(name string) string {
  23. if name == "" {
  24. return ""
  25. }
  26. temp := strings.Split(name, "_")
  27. var s string
  28. for _, v := range temp {
  29. vv := []rune(v)
  30. if len(vv) > 0 {
  31. if bool(vv[0] >= 'a' && vv[0] <= 'z') { //首字母大写
  32. vv[0] -= 32
  33. }
  34. s += string(vv)
  35. }
  36. }
  37. s = uncommonInitialismsReplacer.Replace(s)
  38. //smap.Set(name, s)
  39. return s
  40. }
  41. /**
  42. 驼峰->下划线
  43. */
  44. func UnMarshal(name string) string {
  45. const (
  46. lower = false
  47. upper = true
  48. )
  49. if name == "" {
  50. return ""
  51. }
  52. var (
  53. value = commonInitialismsReplacer.Replace(name)
  54. buf = bytes.NewBufferString("")
  55. lastCase, currCase, nextCase, nextNumber bool
  56. )
  57. for i, v := range value[:len(value)-1] {
  58. nextCase = bool(value[i+1] >= 'A' && value[i+1] <= 'Z')
  59. nextNumber = bool(value[i+1] >= '0' && value[i+1] <= '9')
  60. if i > 0 {
  61. if currCase == upper {
  62. if lastCase == upper && (nextCase == upper || nextNumber == upper) {
  63. buf.WriteRune(v)
  64. } else {
  65. if value[i-1] != '_' && value[i+1] != '_' {
  66. buf.WriteRune('_')
  67. }
  68. buf.WriteRune(v)
  69. }
  70. } else {
  71. buf.WriteRune(v)
  72. if i == len(value)-2 && (nextCase == upper && nextNumber == lower) {
  73. buf.WriteRune('_')
  74. }
  75. }
  76. } else {
  77. currCase = upper
  78. buf.WriteRune(v)
  79. }
  80. lastCase = currCase
  81. currCase = nextCase
  82. }
  83. buf.WriteByte(value[len(value)-1])
  84. s := strings.ToLower(buf.String())
  85. return s
  86. }