common.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. package common
  2. import (
  3. "crypto/md5"
  4. cryptoRand "crypto/rand"
  5. "encoding/hex"
  6. "encoding/json"
  7. "encoding/xml"
  8. "fmt"
  9. "io"
  10. "log"
  11. "math"
  12. "math/big"
  13. mathRand "math/rand"
  14. "net/http"
  15. "reflect"
  16. "regexp"
  17. "runtime"
  18. "sort"
  19. "strconv"
  20. "strings"
  21. "time"
  22. date4 "app.yhyue.com/moapp/jybase/date"
  23. "app.yhyue.com/moapp/jybase/dchest/captcha"
  24. )
  25. const (
  26. tmp = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345678900"
  27. )
  28. func Uuid(length int) string {
  29. ret := []string{}
  30. r := mathRand.New(mathRand.NewSource(time.Now().UnixNano()))
  31. for i := 0; i < length; i++ {
  32. index := r.Intn(62)
  33. ret = append(ret, tmp[index:index+1])
  34. }
  35. return strings.Join(ret, "")
  36. }
  37. //计算字符串和值
  38. func Sumstring(code string) (sum int) {
  39. tmp := []rune(code)
  40. for _, v := range tmp {
  41. sum = sum + int(v)
  42. }
  43. return
  44. }
  45. //获取随机数
  46. func GetRandom(n int) string {
  47. var idChars = []byte("0123456789")
  48. b := captcha.RandomDigits(n)
  49. for i, c := range b {
  50. b[i] = idChars[c]
  51. }
  52. return string(b)
  53. }
  54. //获取复杂的随机数
  55. func GetLetterRandom(length int, flag ...bool) string {
  56. var idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")
  57. var mod byte = 52
  58. if len(flag) > 0 && flag[0] {
  59. idChars = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  60. mod = 26
  61. }
  62. b := make([]byte, length)
  63. maxrb := byte(256 - (256 % int(mod)))
  64. i := 0
  65. EXIT:
  66. for {
  67. r := make([]byte, length+(length/4))
  68. if _, err := io.ReadFull(cryptoRand.Reader, r); err != nil {
  69. panic("captcha: error reading random source: " + err.Error())
  70. }
  71. for _, c := range r {
  72. if c > maxrb {
  73. continue
  74. }
  75. b[i] = c % mod
  76. i++
  77. if i == length {
  78. break EXIT
  79. }
  80. }
  81. }
  82. for i, c := range b {
  83. b[i] = idChars[c]
  84. }
  85. return string(b)
  86. }
  87. /*获取复杂的随机数,数字和字母的组合
  88. * c > 2 数字的个数和字母的个数随机分配
  89. * n 数字的个数
  90. * l 字母的个数
  91. */
  92. func GetComplexRandom(c, n, l int) string {
  93. if c < 2 && (n < 1 || l < 1) {
  94. return "--"
  95. }
  96. r := mathRand.New(mathRand.NewSource(time.Now().UnixNano()))
  97. myCommonMethod := func(flag bool) int {
  98. if flag {
  99. return r.Intn(c-1) + 1
  100. } else {
  101. return r.Intn(c)
  102. }
  103. }
  104. if c >= 2 {
  105. n = myCommonMethod(true)
  106. l = c - n
  107. } else {
  108. c = l + n
  109. }
  110. value := GetRandom(n) + GetLetterRandom(l)
  111. var array = strings.Split(value, "")
  112. for i := 0; i < c/2; i++ {
  113. r1 := myCommonMethod(false)
  114. r2 := myCommonMethod(false)
  115. o := array[r1]
  116. array[r1] = array[r2]
  117. array[r2] = o
  118. }
  119. return strings.Join(array, "")
  120. }
  121. /*隐藏部分账号
  122. *返回手机号:150...70765 邮箱:...shenjun@vip.qq.com
  123. */
  124. func EncryCode(value string) string {
  125. if len(value) == 0 {
  126. return value
  127. } else if strings.Contains(value, "@") {
  128. start := strings.Index(value, "@") / 2
  129. if start == 0 {
  130. start++
  131. }
  132. value = "...." + string(value[start:])
  133. } else {
  134. value = string(value[0:3]) + "..." + string(value[len(value)-4:])
  135. }
  136. return value
  137. }
  138. //生成32位md5字串
  139. func GetMd5String(s string) string {
  140. h := md5.New()
  141. h.Write([]byte(s))
  142. return hex.EncodeToString(h.Sum(nil))
  143. }
  144. //obj(string,M)转M,查询用到
  145. func ObjToMap(obj interface{}) *map[string]interface{} {
  146. data := make(map[string]interface{})
  147. if s, ok := obj.(string); ok {
  148. json.Unmarshal([]byte(strings.Replace(s, "'", "\"", -1)), &data)
  149. } else if s1, ok1 := obj.(map[string]interface{}); ok1 {
  150. data = s1
  151. } else if s1, ok1 := obj.(*map[string]interface{}); ok1 {
  152. return s1
  153. } else {
  154. data = nil
  155. }
  156. return &data
  157. }
  158. /*UTC类型时间转字符串
  159. *flag==true,日期格式yyyy-mm-dd hh:mm:ss
  160. *flag==false,日期格式yyyy-mm-dd
  161. */
  162. func LongToDate(date interface{}, flag bool) string {
  163. var int64Date int64
  164. if l1, ok1 := date.(float64); ok1 {
  165. int64Date = int64(l1)
  166. } else if l2, ok2 := date.(int64); ok2 {
  167. int64Date = l2
  168. } else if l3, ok3 := date.(int); ok3 {
  169. int64Date = int64(l3)
  170. }
  171. t := time.Unix(int64Date, 0)
  172. if flag {
  173. return t.Format("2006-01-02 15:04:05")
  174. } else {
  175. return t.Format("2006-01-02")
  176. }
  177. }
  178. func IntAll(num interface{}) int {
  179. return IntAllDef(num, 0)
  180. }
  181. func Int64All(num interface{}) int64 {
  182. if i, ok := num.(int64); ok {
  183. return int64(i)
  184. } else if i0, ok0 := num.(int32); ok0 {
  185. return int64(i0)
  186. } else if i1, ok1 := num.(float64); ok1 {
  187. return int64(i1)
  188. } else if i2, ok2 := num.(int); ok2 {
  189. return int64(i2)
  190. } else if i3, ok3 := num.(float32); ok3 {
  191. return int64(i3)
  192. } else if i4, ok4 := num.(string); ok4 {
  193. i64, _ := strconv.ParseInt(i4, 10, 64)
  194. //in, _ := strconv.Atoi(i4)
  195. return i64
  196. } else if i5, ok5 := num.(int16); ok5 {
  197. return int64(i5)
  198. } else if i6, ok6 := num.(int8); ok6 {
  199. return int64(i6)
  200. } else if i7, ok7 := num.(*big.Int); ok7 {
  201. in, _ := strconv.ParseInt(fmt.Sprint(i7), 10, 64)
  202. return int64(in)
  203. } else if i8, ok8 := num.(*big.Float); ok8 {
  204. in, _ := strconv.ParseInt(fmt.Sprint(i8), 10, 64)
  205. return int64(in)
  206. } else {
  207. return 0
  208. }
  209. }
  210. func Float64All(num interface{}) float64 {
  211. if i, ok := num.(float64); ok {
  212. return float64(i)
  213. } else if i0, ok0 := num.(int32); ok0 {
  214. return float64(i0)
  215. } else if i1, ok1 := num.(int64); ok1 {
  216. return float64(i1)
  217. } else if i2, ok2 := num.(int); ok2 {
  218. return float64(i2)
  219. } else if i3, ok3 := num.(float32); ok3 {
  220. return float64(i3)
  221. } else if i4, ok4 := num.(string); ok4 {
  222. in, _ := strconv.ParseFloat(i4, 64)
  223. return in
  224. } else if i5, ok5 := num.(int16); ok5 {
  225. return float64(i5)
  226. } else if i6, ok6 := num.(int8); ok6 {
  227. return float64(i6)
  228. } else if i6, ok6 := num.(uint); ok6 {
  229. return float64(i6)
  230. } else if i6, ok6 := num.(uint8); ok6 {
  231. return float64(i6)
  232. } else if i6, ok6 := num.(uint16); ok6 {
  233. return float64(i6)
  234. } else if i6, ok6 := num.(uint32); ok6 {
  235. return float64(i6)
  236. } else if i6, ok6 := num.(uint64); ok6 {
  237. return float64(i6)
  238. } else if i7, ok7 := num.(*big.Float); ok7 {
  239. in, _ := strconv.ParseFloat(fmt.Sprint(i7), 64)
  240. return float64(in)
  241. } else if i8, ok8 := num.(*big.Int); ok8 {
  242. in, _ := strconv.ParseFloat(fmt.Sprint(i8), 64)
  243. return float64(in)
  244. } else {
  245. return 0
  246. }
  247. }
  248. func IntAllDef(num interface{}, defaultNum int) int {
  249. if i, ok := num.(int); ok {
  250. return int(i)
  251. } else if i0, ok0 := num.(int32); ok0 {
  252. return int(i0)
  253. } else if i1, ok1 := num.(float64); ok1 {
  254. return int(i1)
  255. } else if i2, ok2 := num.(int64); ok2 {
  256. return int(i2)
  257. } else if i3, ok3 := num.(float32); ok3 {
  258. return int(i3)
  259. } else if i4, ok4 := num.(string); ok4 {
  260. in, _ := strconv.Atoi(i4)
  261. return int(in)
  262. } else if i5, ok5 := num.(int16); ok5 {
  263. return int(i5)
  264. } else if i6, ok6 := num.(int8); ok6 {
  265. return int(i6)
  266. } else if i7, ok7 := num.(*big.Int); ok7 {
  267. in, _ := strconv.Atoi(fmt.Sprint(i7))
  268. return int(in)
  269. } else if i8, ok8 := num.(*big.Float); ok8 {
  270. in, _ := strconv.Atoi(fmt.Sprint(i8))
  271. return int(in)
  272. } else {
  273. return defaultNum
  274. }
  275. }
  276. func ObjToString(old interface{}) string {
  277. if nil == old {
  278. return ""
  279. } else if r1, ok1 := old.(string); ok1 {
  280. return r1
  281. } else if r2, ok2 := old.(*string); ok2 {
  282. return *r2
  283. }
  284. return ""
  285. }
  286. func ObjToStringDef(old interface{}, defaultstr string) string {
  287. if nil == old {
  288. return defaultstr
  289. } else {
  290. r, _ := old.(string)
  291. if r == "" {
  292. return defaultstr
  293. }
  294. return r
  295. }
  296. }
  297. //对象数组转成string数组
  298. func ObjArrToStringArr(old []interface{}) []string {
  299. if old != nil {
  300. new := make([]string, len(old))
  301. for i, v := range old {
  302. new[i], _ = v.(string)
  303. }
  304. return new
  305. } else {
  306. return nil
  307. }
  308. }
  309. //对象数组转成map数组
  310. func ObjArrToMapArr(old []interface{}) []map[string]interface{} {
  311. if old != nil {
  312. new := make([]map[string]interface{}, len(old))
  313. for i, v := range old {
  314. new[i], _ = v.(map[string]interface{})
  315. }
  316. return new
  317. } else {
  318. return nil
  319. }
  320. }
  321. //map数组转成对象数组
  322. func MapArrToObjArr(old []map[string]interface{}) []interface{} {
  323. if old != nil {
  324. new := make([]interface{}, len(old))
  325. for i, v := range old {
  326. new[i] = v
  327. }
  328. return new
  329. } else {
  330. return nil
  331. }
  332. }
  333. func SubstrByByte(str string, length int) string {
  334. bs := []byte(str)[:length]
  335. bl := 0
  336. for i := len(bs) - 1; i >= 0; i-- {
  337. switch {
  338. case bs[i] >= 0 && bs[i] <= 127:
  339. return string(bs[:i+1])
  340. case bs[i] >= 128 && bs[i] <= 191:
  341. bl++
  342. case bs[i] >= 192 && bs[i] <= 253:
  343. cl := 0
  344. switch {
  345. case bs[i]&252 == 252:
  346. cl = 6
  347. case bs[i]&248 == 248:
  348. cl = 5
  349. case bs[i]&240 == 240:
  350. cl = 4
  351. case bs[i]&224 == 224:
  352. cl = 3
  353. default:
  354. cl = 2
  355. }
  356. if bl+1 == cl {
  357. return string(bs[:i+cl])
  358. }
  359. return string(bs[:i])
  360. }
  361. }
  362. return ""
  363. }
  364. func SubString(str string, begin, length int) (substr string) {
  365. // 将字符串的转换成[]rune
  366. rs := []rune(str)
  367. lth := len(rs)
  368. // 简单的越界判断
  369. if begin < 0 {
  370. begin = 0
  371. }
  372. if begin >= lth {
  373. begin = lth
  374. }
  375. end := begin + length
  376. if end > lth {
  377. end = lth
  378. }
  379. // 返回子串
  380. return string(rs[begin:end])
  381. }
  382. //捕获异常
  383. func Try(fun func(), handler func(interface{})) {
  384. defer func() {
  385. if err := recover(); err != nil {
  386. for skip := 1; ; skip++ {
  387. _, file, line, ok := runtime.Caller(skip)
  388. if !ok {
  389. break
  390. }
  391. go log.Printf("%v,%v\n", file, line)
  392. }
  393. handler(err)
  394. }
  395. }()
  396. fun()
  397. }
  398. //3目运算
  399. func If(b bool, to, fo interface{}) interface{} {
  400. if b {
  401. return to
  402. } else {
  403. return fo
  404. }
  405. }
  406. //HashCode值
  407. func HashCode(uid string) int {
  408. var h uint32 = 0
  409. rs := []rune(uid)
  410. for i := 0; i < len(rs); i++ {
  411. h = 31*h + uint32(rs[i])
  412. }
  413. return int(h)
  414. }
  415. //获取离n天的秒差
  416. func GetDayStartSecond(n int) int64 {
  417. now := time.Now()
  418. tom := time.Date(now.Year(), now.Month(), now.Day()+n, 0, 0, 0, 0, time.Local)
  419. return tom.Unix()
  420. }
  421. func InterfaceArrTointArr(arr []interface{}) []int {
  422. tmp := make([]int, 0)
  423. for _, v := range arr {
  424. tmp = append(tmp, int(v.(float64)))
  425. }
  426. return tmp
  427. }
  428. func InterfaceArrToint64Arr(arr []interface{}) []int64 {
  429. tmp := make([]int64, 0)
  430. for _, v := range arr {
  431. tmp = append(tmp, int64(v.(float64)))
  432. }
  433. return tmp
  434. }
  435. func GetSubDay(t1 int64) int {
  436. tt1 := time.Unix(t1, 0)
  437. tt2 := time.Now()
  438. nt1 := time.Date(tt1.Year(), tt1.Month(), tt1.Day(), 0, 0, 0, 0, time.Local)
  439. nt2 := time.Date(tt2.Year(), tt2.Month(), tt2.Day(), 0, 0, 0, 0, time.Local)
  440. return int((nt1.Unix() - nt2.Unix()) / 86400)
  441. }
  442. func StartWith(value, str string) bool {
  443. ok, _ := regexp.MatchString("^"+str, value)
  444. return ok
  445. }
  446. func EndWith(value, str string) bool {
  447. ok, _ := regexp.MatchString(str+"$", value)
  448. return ok
  449. }
  450. //出错拦截
  451. func Catch() {
  452. if r := recover(); r != nil {
  453. log.Println(r)
  454. for skip := 0; ; skip++ {
  455. _, file, line, ok := runtime.Caller(skip)
  456. if !ok {
  457. break
  458. }
  459. go log.Printf("%v,%v\n", file, line)
  460. }
  461. }
  462. }
  463. func ConvertFileSize(s int) string {
  464. size := float64(s)
  465. var kb float64 = 1024
  466. var mb float64 = kb * 1024
  467. var gb float64 = mb * 1024
  468. if size >= gb {
  469. return fmt.Sprintf("%.1f GB", float64(size/gb))
  470. } else if size >= mb {
  471. f := float64(size / mb)
  472. if f > 100 {
  473. return fmt.Sprintf("%.0f MB", f)
  474. }
  475. return fmt.Sprintf("%.1f MB", f)
  476. } else if size >= kb {
  477. f := float64(size / kb)
  478. if f > 100 {
  479. return fmt.Sprintf("%.0f KB", f)
  480. }
  481. return fmt.Sprintf("%.1f KB", f)
  482. }
  483. return fmt.Sprintf("%d B", s)
  484. }
  485. //MD5签名
  486. func WxSign(format string, param ...interface{}) string {
  487. data := fmt.Sprintf(format, param...)
  488. h := md5.New()
  489. h.Write([]byte(data))
  490. sign := strings.ToUpper(hex.EncodeToString(h.Sum(nil)))
  491. return sign
  492. }
  493. //计算时差
  494. func TimeDiff(date time.Time) string {
  495. var date1 = date //开始时间
  496. var date2 = time.Now() //结束时间
  497. var date3 = date2.Unix() - date1.Unix() //时间差的毫秒数
  498. //计算出相差天数
  499. var days = math.Floor(float64(date3 / (24 * 3600)))
  500. //计算出小时数
  501. var leave1 = date3 % (24 * 3600) //计算天数后剩余的毫秒数
  502. var hours = math.Floor(float64(leave1 / (3600)))
  503. //计算相差分钟数
  504. var leave2 = leave1 % (3600) //计算小时数后剩余的毫秒数
  505. var minutes = math.Floor(float64(leave2 / (60)))
  506. //计算相差秒数
  507. var td = "30秒前"
  508. if days > 0 {
  509. if days > 10 {
  510. if date1.Year() < date2.Year() {
  511. td = date4.FormatDate(&date, date4.Date_Short_Layout)
  512. } else {
  513. td = date4.FormatDate(&date, date4.Date_Small_Layout)
  514. }
  515. } else {
  516. td = fmt.Sprint(days) + "天前"
  517. }
  518. } else if hours > 0 {
  519. td = fmt.Sprint(hours) + "小时前"
  520. } else if minutes > 0 {
  521. td = fmt.Sprint(minutes) + "分钟前"
  522. }
  523. return td
  524. }
  525. func FloatFormat(tmp float64, n int) float64 {
  526. fs := fmt.Sprintf("%."+fmt.Sprint(n)+"f", tmp)
  527. f, _ := strconv.ParseFloat(fs, 64)
  528. return f
  529. }
  530. //生成微信支付的签名
  531. func CreateWxSign(afterStr string, obj interface{}, filter ...string) string {
  532. filter = append(filter, "sign", "xml")
  533. keys := []string{}
  534. m := make(map[string]string)
  535. t := reflect.TypeOf(obj)
  536. v := reflect.ValueOf(obj)
  537. k := t.Kind()
  538. if t.Kind() == reflect.Ptr {
  539. t = t.Elem()
  540. k = t.Kind()
  541. v = v.Elem()
  542. }
  543. if k == reflect.Map {
  544. for _, key := range v.MapKeys() {
  545. keys = append(keys, key.String())
  546. m[key.String()] = fmt.Sprint(v.MapIndex(key).Interface())
  547. }
  548. } else if k == reflect.Struct {
  549. for n := 0; n < t.NumField(); n++ {
  550. tagName := t.Field(n).Tag.Get("xml")
  551. if tagName == "" {
  552. tagName = t.Field(n).Tag.Get("json")
  553. }
  554. if tagName == "" {
  555. tagName = t.Field(n).Name
  556. }
  557. keys = append(keys, tagName)
  558. m[tagName] = fmt.Sprint(v.Field(n))
  559. }
  560. }
  561. sort.Strings(keys)
  562. vs := []string{}
  563. L:
  564. for _, v := range keys {
  565. for _, f := range filter {
  566. if f == v {
  567. continue L
  568. }
  569. }
  570. if strings.TrimSpace(m[v]) == "" {
  571. continue
  572. }
  573. vs = append(vs, fmt.Sprintf("%s=%s", v, m[v]))
  574. }
  575. return WxSign(strings.Join(vs, "&") + afterStr)
  576. }
  577. //简单的xml转map,只有一个层级,没有多层嵌套
  578. func XmlToMap(input string) map[string]string {
  579. var t xml.Token
  580. var err error
  581. inputReader := strings.NewReader(input)
  582. decoder := xml.NewDecoder(inputReader)
  583. isStart := false
  584. nodeName := ""
  585. m := make(map[string]string)
  586. for t, err = decoder.Token(); err == nil; t, err = decoder.Token() {
  587. switch token := t.(type) {
  588. // 处理元素开始(标签)
  589. case xml.StartElement:
  590. isStart = true
  591. nodeName = token.Name.Local
  592. // 处理元素结束(标签)
  593. case xml.EndElement:
  594. isStart = false
  595. // 处理字符数据(这里就是元素的文本)
  596. case xml.CharData:
  597. if isStart {
  598. m[nodeName] = string([]byte(token))
  599. }
  600. default:
  601. // ...
  602. }
  603. }
  604. return m
  605. }
  606. func SimpleCrontab(flag bool, c string, f func()) {
  607. array := strings.Split(c, ":")
  608. if len(array) != 2 {
  609. log.Fatalln("定时任务参数错误!", c)
  610. }
  611. if flag {
  612. go f()
  613. }
  614. now := time.Now()
  615. t := time.Date(now.Year(), now.Month(), now.Day(), IntAll(array[0]), IntAll(array[1]), 0, 0, time.Local)
  616. if t.Before(now) {
  617. t = t.AddDate(0, 0, 1)
  618. }
  619. sub := t.Sub(now)
  620. log.Println(c, "run after", sub)
  621. timer := time.NewTimer(sub)
  622. for {
  623. select {
  624. case <-timer.C:
  625. go f()
  626. log.Println(c, "run after", 24*time.Hour)
  627. timer.Reset(24 * time.Hour)
  628. }
  629. }
  630. }
  631. //v保留n为小数,n后的四舍五入
  632. func RetainDecimal(v float64, n int) float64 {
  633. n10 := math.Pow10(n)
  634. return math.Trunc((v+0.5/n10)*n10) / n10
  635. }
  636. //序列化成想要的类型,再断言
  637. func JsonUnmarshal(m interface{}, s interface{}) interface{} {
  638. JsonUnmarshalByErr(m, s)
  639. return s
  640. }
  641. //序列化成想要的类型,再断言
  642. func JsonUnmarshalByErr(m interface{}, s interface{}) (interface{}, error) {
  643. var b []byte
  644. var err error
  645. if v, ok := m.(string); ok {
  646. b = []byte(v)
  647. } else if v, ok := m.([]byte); ok {
  648. b = v
  649. } else {
  650. b, err = json.Marshal(m)
  651. }
  652. if err == nil {
  653. err = json.Unmarshal(b, &s)
  654. }
  655. return s, err
  656. }
  657. func MapToJson(param map[string]interface{}) string {
  658. if param == nil {
  659. return ""
  660. }
  661. dataType, _ := json.Marshal(param)
  662. dataString := string(dataType)
  663. return dataString
  664. }
  665. // 将string转换成map
  666. func StringToMap(str string) (jmap map[string]interface{}) {
  667. if err := json.Unmarshal([]byte(str), &jmap); err == nil {
  668. return
  669. } else {
  670. return
  671. }
  672. }
  673. // struct 转map
  674. func StructToMapMore(obj interface{}) map[string]interface{} {
  675. m := make(map[string]interface{})
  676. j, _ := json.Marshal(obj)
  677. _ = json.Unmarshal(j, &m)
  678. return m
  679. }
  680. // 向上取整
  681. func MathCeil(x float64) int {
  682. return int(math.Ceil(x + 0/5))
  683. }
  684. // 向下取整
  685. func MathFloor(x float64) int {
  686. return int(math.Floor(x + 0/5))
  687. }
  688. // data 转换成ret
  689. func Bind(data interface{}, ret interface{}) error {
  690. v := reflect.ValueOf(ret)
  691. if v.Kind() != reflect.Ptr {
  692. return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
  693. }
  694. havdata := false
  695. var bk interface{}
  696. if v.Elem().Kind() == reflect.Slice {
  697. t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
  698. bk = v.Elem().Interface()
  699. v.Elem().Set(t)
  700. havdata = true
  701. }
  702. _data, _ := json.MarshalIndent(data, "", " ")
  703. err := json.Unmarshal(_data, ret)
  704. if err != nil {
  705. fmt.Println(err)
  706. if havdata {
  707. v.Elem().Set(reflect.ValueOf(bk))
  708. }
  709. return err
  710. }
  711. return nil
  712. }
  713. //string
  714. func InterfaceToStr(x interface{}) string {
  715. switch st := reflect.ValueOf(x); st.Kind() {
  716. case reflect.Uint, reflect.Uintptr, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  717. return strconv.FormatUint(uint64(st.Uint()), 10)
  718. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  719. return strconv.FormatInt(int64(st.Int()), 10)
  720. case reflect.Float32, reflect.Float64:
  721. return strconv.FormatFloat(float64(st.Float()), 'g', -1, 64)
  722. case reflect.Bool:
  723. return strconv.FormatBool(st.Bool())
  724. }
  725. var ret string
  726. _ = Bind(x, &ret)
  727. return ret
  728. }
  729. //StrFormat string追加格式化双引号
  730. func StrFormat(s string) string {
  731. if s == "" {
  732. return ""
  733. }
  734. return fmt.Sprintf("\"%s\"", s)
  735. }
  736. //判断是否是微信访问
  737. func IsWxBrowser(Request *http.Request) bool {
  738. if strings.Index(Request.UserAgent(), "MicroMessenger") > -1 || strings.Index(Request.UserAgent(), "Wechat") > -1 {
  739. return true
  740. } else {
  741. return false
  742. }
  743. }
  744. //
  745. func ShortenTxt(length int, fixed, shorten string) string {
  746. if len([]rune(fixed)) > length {
  747. return ""
  748. } else if len([]rune(fixed+shorten)) <= length {
  749. return shorten
  750. }
  751. if limit := length - len([]rune(fixed)) - 3; limit >= 0 && limit <= len([]rune(shorten)) {
  752. return string([]rune(shorten)[:limit]) + "..."
  753. }
  754. return ""
  755. }
  756. //获取问号占位符数量及对应的参数值
  757. func WhArgs(args []string) (string, []interface{}) {
  758. newArgs := make([]interface{}, len(args))
  759. wh := make([]string, len(args))
  760. for k, v := range args {
  761. newArgs[k] = v
  762. wh[k] = "?"
  763. }
  764. return strings.Join(wh, ","), newArgs
  765. }