123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- /*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package utils
- import (
- "crypto/md5"
- "crypto/rand"
- "encoding/base64"
- "encoding/hex"
- "hash"
- rand2 "math/rand"
- "net/url"
- "reflect"
- "strconv"
- "time"
- )
- type UUID [16]byte
- const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
- func GetUUID() (uuidHex string) {
- uuid := NewUUID()
- uuidHex = hex.EncodeToString(uuid[:])
- return
- }
- func RandStringBytes(n int) string {
- b := make([]byte, n)
- for i := range b {
- b[i] = letterBytes[rand2.Intn(len(letterBytes))]
- }
- return string(b)
- }
- func GetMD5Base64(bytes []byte) (base64Value string) {
- md5Ctx := md5.New()
- md5Ctx.Write(bytes)
- md5Value := md5Ctx.Sum(nil)
- base64Value = base64.StdEncoding.EncodeToString(md5Value)
- return
- }
- func GetTimeInFormatISO8601() (timeStr string) {
- gmt := time.FixedZone("GMT", 0)
- return time.Now().In(gmt).Format("2006-01-02T15:04:05Z")
- }
- func GetTimeInFormatRFC2616() (timeStr string) {
- gmt := time.FixedZone("GMT", 0)
- return time.Now().In(gmt).Format("Mon, 02 Jan 2006 15:04:05 GMT")
- }
- func GetUrlFormedMap(source map[string]string) (urlEncoded string) {
- urlEncoder := url.Values{}
- for key, value := range source {
- urlEncoder.Add(key, value)
- }
- urlEncoded = urlEncoder.Encode()
- return
- }
- func InitStructWithDefaultTag(bean interface{}) {
- configType := reflect.TypeOf(bean)
- for i := 0; i < configType.Elem().NumField(); i++ {
- field := configType.Elem().Field(i)
- defaultValue := field.Tag.Get("default")
- if defaultValue == "" {
- continue
- }
- setter := reflect.ValueOf(bean).Elem().Field(i)
- switch field.Type.String() {
- case "int":
- intValue, _ := strconv.ParseInt(defaultValue, 10, 64)
- setter.SetInt(intValue)
- case "time.Duration":
- intValue, _ := strconv.ParseInt(defaultValue, 10, 64)
- setter.SetInt(intValue)
- case "string":
- setter.SetString(defaultValue)
- case "bool":
- boolValue, _ := strconv.ParseBool(defaultValue)
- setter.SetBool(boolValue)
- }
- }
- }
- func NewUUID() UUID {
- ns := UUID{}
- safeRandom(ns[:])
- u := newFromHash(md5.New(), ns, RandStringBytes(16))
- u[6] = (u[6] & 0x0f) | (byte(2) << 4)
- u[8] = (u[8]&(0xff>>2) | (0x02 << 6))
- return u
- }
- func newFromHash(h hash.Hash, ns UUID, name string) UUID {
- u := UUID{}
- h.Write(ns[:])
- h.Write([]byte(name))
- copy(u[:], h.Sum(nil))
- return u
- }
- func safeRandom(dest []byte) {
- if _, err := rand.Read(dest); err != nil {
- panic(err)
- }
- }
- func (u UUID) String() string {
- buf := make([]byte, 36)
- hex.Encode(buf[0:8], u[0:4])
- buf[8] = '-'
- hex.Encode(buf[9:13], u[4:6])
- buf[13] = '-'
- hex.Encode(buf[14:18], u[6:8])
- buf[18] = '-'
- hex.Encode(buf[19:23], u[8:10])
- buf[23] = '-'
- hex.Encode(buf[24:], u[10:])
- return string(buf)
- }
|