首页 > 其他分享 >GO 常用辅助函数

GO 常用辅助函数

时间:2023-09-05 16:23:28浏览次数:42  
标签:case return 函数 int64 str time GO 辅助 string

package comm

import (
"crypto/aes"
"crypto/cipher"
"crypto/md5"
"encoding/base64"
"encoding/binary"
"errors"
"fmt"
"lottery/conf"
"math/rand"
"strconv"
"strings"
"time"
)

// NowUnix 当前时间的时间戳
func NowUnix() int {
return int(time.Now().In(conf.SysTimeLocation).Unix())
}

// FormatFromUnixTime 将unix时间戳格式化为yyyymmdd H:i:s格式字符串
func FormatFromUnixTime(t int64) string {
if t > 0 {
return time.Unix(t, 0).Format(conf.SysTimeform)
} else {
return time.Now().Format(conf.SysTimeform)
}
}

// FormatFromUnixTimeShort 将unix时间戳格式化为yyyymmdd格式字符串
func FormatFromUnixTimeShort(t int64) string {
if t > 0 {
return time.Unix(t, 0).Format(conf.SysTimeformShort)
} else {
return time.Now().Format(conf.SysTimeformShort)
}
}

// ParseTime 将字符串转成时间
func ParseTime(str string) (time.Time, error) {
return time.ParseInLocation(conf.SysTimeform, str, conf.SysTimeLocation)
}

// Random 得到一个随机数
func Random(max int) int {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
if max < 1 {
return r.Int()
} else {
return r.Intn(max)
}
}

func CreateSign(str string) string {
str = string(conf.SignSecret) + str
sign := fmt.Sprintf("%x", md5.Sum([]byte(str)))
return sign
}

// encrypt对一个字符串进行加密
func encrypt(key, text []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
b := base64.StdEncoding.EncodeToString(text)
ciphertext := make([]byte, aes.BlockSize+len(b))
iv := ciphertext[:aes.BlockSize]
cfb := cipher.NewCFBEncrypter(block, iv)
cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b))
return ciphertext, nil
}

// decrypt 对一个字符串进行解密
func decrypt(key, text []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
if len(text) < aes.BlockSize {
return nil, errors.New("ciphertext too short")
}
iv := text[:aes.BlockSize]
text = text[aes.BlockSize:]
cfb := cipher.NewCFBDecrypter(block, iv)
cfb.XORKeyStream(text, text)
data, err := base64.StdEncoding.DecodeString(string(text))
if err != nil {
return nil, err
}
return data, nil
}

// Addslashes 函数返回在预定义字符之前添加反斜杠的字符串。
// 预定义字符是:
// 单引号(')
// 双引号(")
// 反斜杠(\)
func Addslashes(str string) string {
tmpRune := []rune{}
strRune := []rune(str)
for _, ch := range strRune {
switch ch {
case []rune{'\\'}[0], []rune{'"'}[0], []rune{'\''}[0]:
tmpRune = append(tmpRune, []rune{'\\'}[0])
tmpRune = append(tmpRune, ch)
default:
tmpRune = append(tmpRune, ch)
}
}
return string(tmpRune)
}

// Stripslashes 函数删除由 addslashes() 函数添加的反斜杠。
func Stripslashes(str string) string {
dstRune := []rune{}
strRune := []rune(str)
strLenth := len(strRune)
for i := 0; i < strLenth; i++ {
if strRune[i] == []rune{'\\'}[0] {
i++
}
dstRune = append(dstRune, strRune[i])
}
return string(dstRune)
}

// Ip4toInt 将字符串的IP转化为数字
func Ip4toInt(ip string) int64 {
bits := strings.Split(ip, ".")
if len(bits) == 4 {
b0, _ := strconv.Atoi(bits[0])
b1, _ := strconv.Atoi(bits[1])
b2, _ := strconv.Atoi(bits[2])
b3, _ := strconv.Atoi(bits[3])
var sum int64
sum += int64(b0) << 24
sum += int64(b1) << 16
sum += int64(b2) << 8
sum += int64(b3)
return sum
} else {
return 0
}
}

// NextDayDuration 得到当前时间到下一天零点的延时
func NextDayDuration() time.Duration {
year, month, day := time.Now().Add(time.Hour * 24).Date()
next := time.Date(year, month, day, 0, 0, 0, 0, conf.SysTimeLocation)
return next.Sub(time.Now())
}

// GetInt64 从接口类型安全获取到int64
func GetInt64(i interface{}, d int64) int64 {
if i == nil {
return d
}
switch i.(type) {
case string:
num, err := strconv.Atoi(i.(string))
if err != nil {
return d
} else {
return int64(num)
}
case []byte:
bits := i.([]byte)
if len(bits) == 8 {
return int64(binary.LittleEndian.Uint64(bits))
} else if len(bits) <= 4 {
num, err := strconv.Atoi(string(bits))
if err != nil {
return d
} else {
return int64(num)
}
}
case uint:
return int64(i.(uint))
case uint8:
return int64(i.(uint8))
case uint16:
return int64(i.(uint16))
case uint32:
return int64(i.(uint32))
case uint64:
return int64(i.(uint64))
case int:
return int64(i.(int))
case int8:
return int64(i.(int8))
case int16:
return int64(i.(int16))
case int32:
return int64(i.(int32))
case int64:
return i.(int64)
case float32:
return int64(i.(float32))
case float64:
return int64(i.(float64))
}
return d
}

// GetString 从接口类型安全获取到字符串类型
func GetString(str interface{}, d string) string {
if str == nil {
return d
}
switch str.(type) {
case string:
return str.(string)
case []byte:
return string(str.([]byte))
}
return fmt.Sprintf("%s", str)
}

// GetInt64FromMap 从map中得到指定的key
func GetInt64FromMap(dm map[string]interface{}, key string, dft int64) int64 {
data, ok := dm[key]
if !ok {
return dft
}
return GetInt64(data, dft)
}

// GetInt64FromStringMap 从map中得到指定的key
func GetInt64FromStringMap(dm map[string]string, key string, dft int64) int64 {
data, ok := dm[key]
if !ok {
return dft
}
return GetInt64(data, dft)
}

// GetStringFromMap 从map中得到指定的key
func GetStringFromMap(dm map[string]interface{}, key string, dft string) string {
data, ok := dm[key]
if !ok {
return dft
}
return GetString(data, dft)
}

// GetStringFromStringMap 从map中得到指定的key
func GetStringFromStringMap(dm map[string]string, key string, dft string) string {
data, ok := dm[key]
if !ok {
return dft
}
return data
}

标签:case,return,函数,int64,str,time,GO,辅助,string
From: https://www.cnblogs.com/lisus2000/p/17679972.html

相关文章

  • Go - benchmark cpuprofile
    zzh@ZZHPC:/zdata/MyPrograms/Go/aaa$gotest-runNONE-bench.goos:linuxgoarch:amd64pkg:zzh/aaacpu:Intel(R)Core(TM)i5-9600KCPU@3.70GHzBenchmarkTokenize-66016419742ns/opPASSokzzh/aaa1.392szzh@ZZHPC:/zdata/MyPrograms/Go......
  • 8 函数
    1创建和调用def函数名(输入参数):函数体[returnx]2参数传递形式参数,函数定义处实际参数,函数调用处在函数调用过程中,进行参数的传递如果是不可变对象,在函数体的修改不会影响实参的值如果是可变对象,在函数体的的修改会影响到实参的值3函数的返回值(1)如果函数没有返......
  • 无涯教程-JavaScript - DATE函数
    描述DATE函数返回特定日期的序列号。语法DATE(year,month,day)争论Argument描述Required/Optionalyearyear参数的值可以包含1-4位数字。Excel会根据计算机使用的日期系统解释年份参数。默认情况下,MicrosoftExcelforWindows使用1900日期系统。请参阅下面的......
  • 深度解密 go Context
    问题:不处理Done为怎么样,会泄漏吗?问题:Done()是如何实现,全部子context接受的?问题:没有及时处理context的Done消息,会怎么样,后续处理能来的及吗? Go语言的context包短小精悍,非常适合新手学习。不论是它的源码还是实际使用,都值得投入时间去学习。这篇文章依然想尝试全面、......
  • django-celery定时任务(beat)
    前言Celery可以异步执行,也可以通过定时任务触发Django中使用Celery要在Django项目中使用Celery,您必须首先定义Celery库的一个实例(称为“应用程序”)如果你有一个现代的Django项目布局,比如: 创建一个celery模块,来定义celery实例importo......
  • 定义求x的n次幂的函数,并返回计算结果
    问题定义求x的n次幂的函数,并返回计算结果代码-C语言#include<stdio.h>#include<math.h>int power(int* x,int* y){      int z;    z=pow(*x,*y);    return z;}int main(){    int a,b,s;      scanf("%d%d",&a,&b); ......
  • 无涯教程-JavaScript - DVARP函数
    描述DVARP函数通过使用列表或数据库中符合您指定条件的记录的字段(列)中的数字,基于整个总体计算总体的方差。语法DVARP(database,field,criteria)争论Argument描述Required/Optionaldatabase组成列表或数据库的单元格范围。数据库是相关数据的列表,其中相关信息......
  • 匿名函数中带有for的写详解
    max,min,filte,map,sorted五个内置函数匀可和lamdba函数结合使用用sorted来个例子吧例1; 结果为: 由上得出sorted排序的权重x【0】来决定,而x(帽号前的X)是匿名函数传入的变量参数帽号后的x[0]是返回给匿名函数的值 例2: 结果为: 可见如果中刮号将整个lambda函数刮住得到......
  • 生产环境部署Django项目
    生产环境部署Django项目1、 部署架构IP地址安装服务  172.16.1.251nginxuwsgi(sock方式)dockermysql5.7redis5 Nginx前端Web服务,接收到动态请求通过uwsgi模块将请求转发给uwsgi服务器,uwsgi服务器通过django处理完后返回给Nginx,Nginx返回用户浏览器展示。 既然uwsgi是一个......
  • 无涯教程-JavaScript - DVAR函数
    描述DVAR函数使用与指定条件相匹配的列表或数据库的列中的数字,根据样本估算总体的方差。语法DVAR(database,field,criteria)争论Argument描述Required/Optionaldatabase组成列表或数据库的单元格范围。数据库是相关数据的列表,其中相关信息的行是记录,数据的列......