util.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /**
  2. * 工具包封装
  3. */
  4. package main
  5. import (
  6. "fmt"
  7. "log"
  8. "strings"
  9. "time"
  10. "github.com/yuin/gopher-lua"
  11. )
  12. // Catch 异常崩溃拦截
  13. func Catch() {
  14. if err := recover(); err != nil {
  15. log.Println(err)
  16. }
  17. }
  18. // MapToTable converts a Go map to a lua table
  19. func MapToTable(m map[string]interface{}) *lua.LTable {
  20. // Main table pointer
  21. resultTable := &lua.LTable{}
  22. // Loop map
  23. for key, element := range m {
  24. switch element.(type) {
  25. case float64:
  26. resultTable.RawSetString(key, lua.LNumber(element.(float64)))
  27. case int64:
  28. resultTable.RawSetString(key, lua.LNumber(element.(int64)))
  29. case string:
  30. resultTable.RawSetString(key, lua.LString(element.(string)))
  31. case bool:
  32. resultTable.RawSetString(key, lua.LBool(element.(bool)))
  33. case []byte:
  34. resultTable.RawSetString(key, lua.LString(string(element.([]byte))))
  35. case map[string]interface{}:
  36. // Get table from map
  37. tble := MapToTable(element.(map[string]interface{}))
  38. resultTable.RawSetString(key, tble)
  39. case time.Time:
  40. resultTable.RawSetString(key, lua.LNumber(element.(time.Time).Unix()))
  41. case []map[string]interface{}:
  42. // Create slice table
  43. sliceTable := &lua.LTable{}
  44. // Loop element
  45. for _, s := range element.([]map[string]interface{}) {
  46. // Get table from map
  47. tble := MapToTable(s)
  48. sliceTable.Append(tble)
  49. }
  50. // Set slice table
  51. resultTable.RawSetString(key, sliceTable)
  52. case []interface{}:
  53. // Create slice table
  54. sliceTable := &lua.LTable{}
  55. // Loop interface slice
  56. for _, s := range element.([]interface{}) {
  57. // Switch interface type
  58. switch s.(type) {
  59. case map[string]interface{}:
  60. // Convert map to table
  61. t := MapToTable(s.(map[string]interface{}))
  62. // Append result
  63. sliceTable.Append(t)
  64. case float64:
  65. // Append result as number
  66. sliceTable.Append(lua.LNumber(s.(float64)))
  67. case string:
  68. // Append result as string
  69. sliceTable.Append(lua.LString(s.(string)))
  70. case bool:
  71. // Append result as bool
  72. sliceTable.Append(lua.LBool(s.(bool)))
  73. }
  74. }
  75. // Append to main table
  76. resultTable.RawSetString(key, sliceTable)
  77. }
  78. }
  79. return resultTable
  80. }
  81. // TabletoMap converts a lua table to go map
  82. func TableToMap(t *lua.LTable) map[string]interface{} {
  83. ret := make(map[string]interface{})
  84. t.ForEach(func(k, v lua.LValue) {
  85. key := fmt.Sprint(k)
  86. if val, ok := v.(*lua.LTable); ok {
  87. ret[key] = TableToMap(val)
  88. } else {
  89. if val, ok := v.(lua.LString); ok {
  90. ret[key] = string(val)
  91. } else if val, ok := v.(lua.LNumber); ok {
  92. ret[key] = int64(val)
  93. } else if val, ok := v.(lua.LBool); ok {
  94. ret[key] = bool(val)
  95. } else {
  96. ret[key] = fmt.Sprint(v)
  97. }
  98. }
  99. })
  100. return ret
  101. }
  102. // urlLastSegs
  103. func urlLastSegs(href string, segs int) string {
  104. tmp := strings.Split(href, "/")
  105. if len(tmp) < segs {
  106. return href
  107. }
  108. return strings.Join(tmp[len(tmp)-segs-1:], "/")
  109. }