123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- /**
- * 工具包封装
- */
- package main
- import (
- "fmt"
- "log"
- "strings"
- "time"
- "github.com/yuin/gopher-lua"
- )
- // Catch 异常崩溃拦截
- func Catch() {
- if err := recover(); err != nil {
- log.Println(err)
- }
- }
- // MapToTable converts a Go map to a lua table
- func MapToTable(m map[string]interface{}) *lua.LTable {
- // Main table pointer
- resultTable := &lua.LTable{}
- // Loop map
- for key, element := range m {
- switch element.(type) {
- case float64:
- resultTable.RawSetString(key, lua.LNumber(element.(float64)))
- case int64:
- resultTable.RawSetString(key, lua.LNumber(element.(int64)))
- case string:
- resultTable.RawSetString(key, lua.LString(element.(string)))
- case bool:
- resultTable.RawSetString(key, lua.LBool(element.(bool)))
- case []byte:
- resultTable.RawSetString(key, lua.LString(string(element.([]byte))))
- case map[string]interface{}:
- // Get table from map
- tble := MapToTable(element.(map[string]interface{}))
- resultTable.RawSetString(key, tble)
- case time.Time:
- resultTable.RawSetString(key, lua.LNumber(element.(time.Time).Unix()))
- case []map[string]interface{}:
- // Create slice table
- sliceTable := &lua.LTable{}
- // Loop element
- for _, s := range element.([]map[string]interface{}) {
- // Get table from map
- tble := MapToTable(s)
- sliceTable.Append(tble)
- }
- // Set slice table
- resultTable.RawSetString(key, sliceTable)
- case []interface{}:
- // Create slice table
- sliceTable := &lua.LTable{}
- // Loop interface slice
- for _, s := range element.([]interface{}) {
- // Switch interface type
- switch s.(type) {
- case map[string]interface{}:
- // Convert map to table
- t := MapToTable(s.(map[string]interface{}))
- // Append result
- sliceTable.Append(t)
- case float64:
- // Append result as number
- sliceTable.Append(lua.LNumber(s.(float64)))
- case string:
- // Append result as string
- sliceTable.Append(lua.LString(s.(string)))
- case bool:
- // Append result as bool
- sliceTable.Append(lua.LBool(s.(bool)))
- }
- }
- // Append to main table
- resultTable.RawSetString(key, sliceTable)
- }
- }
- return resultTable
- }
- // TabletoMap converts a lua table to go map
- func TableToMap(t *lua.LTable) map[string]interface{} {
- ret := make(map[string]interface{})
- t.ForEach(func(k, v lua.LValue) {
- key := fmt.Sprint(k)
- if val, ok := v.(*lua.LTable); ok {
- ret[key] = TableToMap(val)
- } else {
- if val, ok := v.(lua.LString); ok {
- ret[key] = string(val)
- } else if val, ok := v.(lua.LNumber); ok {
- ret[key] = int64(val)
- } else if val, ok := v.(lua.LBool); ok {
- ret[key] = bool(val)
- } else {
- ret[key] = fmt.Sprint(v)
- }
- }
- })
- return ret
- }
- // urlLastSegs
- func urlLastSegs(href string, segs int) string {
- tmp := strings.Split(href, "/")
- if len(tmp) < segs {
- return href
- }
- return strings.Join(tmp[len(tmp)-segs-1:], "/")
- }
|