码字不易,转载请附原链,搬砖繁忙回复不及时见谅,技术交流请加QQ群:909211071

最新源码:https://github.com/why444216978/go-util

package utilimport ("bytes""encoding/json""errors""fmt""gopkg.in/gomail.v2""io""log""math/rand""net""net/url""os""path""path/filepath""reflect""strconv""strings""time"
)func ParseUriQueryToMap(query string) map[string]interface{} {queryMap := strings.Split(query, "&")a := make(map[string]interface{}, len(queryMap))for _,item := range queryMap {itemMap := strings.Split(item, "=")a[itemMap[0]] = itemMap[1]}return a
}func MapToJson(data map[string]interface{}) string {jsonStr, err := json.Marshal(data)Must(err)return string(jsonStr)
}func RandomN(n int) int {rand.Seed(time.Now().UnixNano())return rand.Intn(n)
}func Must(err error) {if err != nil {panic(err)}
}func Must2(i interface{}, err error) interface{} {if err != nil {panic(err)}return i
}//获得某一天0点的时间戳
func GetDaysAgoZeroTime(day int) int64 {date := time.Now().AddDate(0, 0, day).Format("2006-01-02")t, _ := time.Parse("2006-01-02", date)return t.Unix()
}//时间戳转人可读
func TimeToHuman(target int) string {var res = ""if target == 0 {return res}t := int(time.Now().Unix()) - targetdata := [7]map[string]interface{}{{"key": 31536000, "value": "年"},{"key": 2592000, "value": "个月"},{"key": 604800, "value": "星期"},{"key": 86400, "value": "天"},{"key": 3600, "value": "小时"},{"key": 60, "value": "分钟"},{"key": 1, "value": "秒"},}for _, v := range data {var c = t / v["key"].(int)if 0 != c {res = strconv.Itoa(c) + v["value"].(string) + "前"break}}return res
}//结构体转map
func StructToMap(obj interface{}) map[string]interface{} {obj1 := reflect.TypeOf(obj)obj2 := reflect.ValueOf(obj)var data = make(map[string]interface{})for i := 0; i < obj1.NumField(); i++ {data[strings.ToLower(obj1.Field(i).Name)] = obj2.Field(i).Interface()}return data
}//在字符串中查找指定字串,并返回left或right部分
func Substr(str string, target string, turn string, hasPos bool) string {pos := strings.Index(str, target)if pos == -1 {return ""}if turn == "left" {if hasPos == true {pos = pos + 1}return str[:pos]} else if turn == "right" {if hasPos == false {pos = pos + 1}return str[pos:]} else {panic("params 3 error")}
}//获得当前绝对路径
func GetCurrentDirectory() string {dir, err := filepath.Abs(filepath.Dir(os.Args[0])) //返回绝对路径  filepath.Dir(os.Args[0])去除最后一个元素的路径if err != nil {log.Fatal(err)}return strings.Replace(dir, "\\", "/", -1) //将\替换成/
}//url的path转文件名
func UriToFilePathByDate(uriPath string, dir string) string {pathArr := strings.Split(uriPath, "/")fileName := strings.Join(pathArr, "-")writePath := CreateDateDir(dir, "") //根据时间检测是否存在目录,不存在创建writePath = RightAddPathPos(writePath)fileName = path.Join(writePath, fileName[1:len(fileName)]+".log")return fileName
}//检测并补全路径左边的反斜杠
func LeftAddPathPos(path string) string {if path[:0] != "/" {path = "/" + path}return path
}//检测并补全路径右边的反斜杠
func RightAddPathPos(path string) string {if path[len(path)-1:len(path)] != "/" {path = path + "/"}return path
}//根据当天日期和给定dir返回log文件名路径
func FileNameByDate(dir string) string {fileName := time.Now().Format("2006-01-02")dir = RightAddPathPos(dir)return dir + fileName + ".log"
}//uri转log路径
func UriToFilePath(uri string, dir string) string {pathArr := strings.Split(uri, "/")fileName := strings.Join(pathArr, "-")fileName = path.Join(dir, fileName[1:len(fileName)]+".log")if fileName[len(fileName)-1:len(fileName)] != "/" {fileName = fileName + "/"}return fileName
}//uri转log文件名
func UriToFileName(uri string) string {pathArr := strings.Split(uri, "/")fileName := strings.Join(pathArr, "-")fileName = fileName + ".log"return fileName
}func LogByUrl(fullUrl string) string {u, err := url.Parse(fullUrl)if err != nil {panic(err)}pathArr := strings.Split(u.Path, "/")fileName := strings.Join(pathArr, "-")writePath := "/tmp/logs/2020-01-12"fileName = path.Join(writePath, fileName[1:len(fileName)]+".log")return fileName
}//根据当前日期,不存在则创建目录
func CreateDateDir(Path string, prex string) string {folderName := time.Now().Format("20060102")if prex != "" {folderName = prex + folderName}folderPath := filepath.Join(Path, folderName)if _, err := os.Stat(folderPath); os.IsNotExist(err) {// 必须分成两步:先创建文件夹、再修改权限os.Mkdir(folderPath, 0777) //0777也可以os.ModePermos.Chmod(folderPath, 0777)}return folderPath
}//使用io.WriteString()函数进行数据的写入,不存在则创建
func WriteWithIo(filePath, content string) error {//os.O_WRONLY | os.O_CREATE | O_EXCL    【如果已经存在,则失败】//os.O_WRONLY | os.O_CREATE    【如果已经存在,会覆盖写,不会清空原来的文件,而是从头直接覆盖写】//os.O_WRONLY | os.O_CREATE | os.O_APPEND    【如果已经存在,则在尾部添加写】fileObj, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0777)if err != nil {fmt.Println("Failed to open the file", err.Error())return err}if content != "" {if _, err := io.WriteString(fileObj, content); err == nil {fmt.Println("Successful appending to the file with os.OpenFile and io.WriteString.", content)return nil}return err}return nil
}/*func StructToByte(tmp struct{}){tmp := &Test{Name: "why", Age: 34, Id: 1}length := unsafe.Sizeof(tmp)data := &SliceMock{addr: uintptr(unsafe.Pointer(tmp)),cap : int(length),len : int(length),}ret := *(*[]byte)(unsafe.Pointer(data))
}*///断言
func Assertion(data interface{}) interface{} {switch data.(type) {case string:return data.(string)case int:return data.(int)case int8:return data.(int8)case int32:return data.(int32)case int64:return data.(int64)case float32:return data.(float32)case float64:return data.(float64)default:return data}return nil
}//发邮件
func SendMail(mailTo string, subject string, body string) error {m := gomail.NewMessage()//设置发件人m.SetHeader("From", "444216978@qq.com")//设置发送给多个用户mailArrTo := strings.Split(mailTo, ",")m.SetHeader("To", mailArrTo...)//设置邮件主题m.SetHeader("Subject", subject)//设置邮件正文m.SetBody("text/html", body)d := gomail.NewDialer("email.qq.com", 587, "444216978@qq.com", "oxlqpamltwqibieg")err := d.DialAndSend(m)if err != nil {fmt.Println(err)}return err
}//json转map数组
func JsonToMapArray(data string) []map[string]interface{} {var res []map[string]interface{}if data == "" {return res}err := json.Unmarshal([]byte(data), &res)Must(err)return res
}//json转map
func JsonToMap(data string) map[string]interface{} {var res map[string]interface{}if data == "" {return res}err := json.Unmarshal([]byte(data), &res)Must(err)return res
}func BytesToString(b *[]byte) *string {s := bytes.NewBuffer(*b)r := s.String()return &r
}func ExternalIP() (string, error) {iFaces, err := net.Interfaces()if err != nil {return "", err}for _, iFace := range iFaces {if iFace.Flags&net.FlagUp == 0 {continue // interface down}if iFace.Flags&net.FlagLoopback != 0 {continue // loopback interface}addrs, err := iFace.Addrs()if err != nil {return "", err}for _, addr := range addrs {var ip net.IPswitch v := addr.(type) {case *net.IPNet:ip = v.IPcase *net.IPAddr:ip = v.IP}if ip == nil || ip.IsLoopback() {continue}ip = ip.To4()if ip == nil {continue // not an ipv4 address}return ip.String(), nil}}return "", errors.New("are you connected to the network?")
}//获得本机名
func HostName() string {hostNamePrefix := ""host, err := os.Hostname()Must(err)if err == nil {parts := strings.SplitN(host, ".", 2)if len(parts) > 0 {hostNamePrefix = parts[0]}}return hostNamePrefix
}/*slice test code:i := 1a := []int{1, 2, 3}fmt.Println(a)res, err := util.InsertSliceByIndex(a , i, 9)util.Must(err)data := res.([]int)fmt.Println(data)res, err = util.DeleteSliceByPos(data, i)util.Must(err)data = res.([]int)fmt.Println(data)res, err = util.UpdateSliceByIndex(data, i , 6)util.Must(err)data = res.([]int)fmt.Println(data)
*/
func DeleteSliceByPos(slice interface{}, index int) (interface{}, error) {v := reflect.ValueOf(slice)if v.Kind() != reflect.Slice {return slice, errors.New("not slice")}if v.Len() == 0 || index < 0 || index > v.Len()-1 {return slice, errors.New("index error")}return reflect.AppendSlice(v.Slice(0, index), v.Slice(index+1, v.Len())).Interface(), nil
}
func InsertSliceByIndex(slice interface{}, index int, value interface{}) (interface{}, error) {v := reflect.ValueOf(slice)if v.Kind() != reflect.Slice {return slice, errors.New("not slice")}if index < 0 || index > v.Len() || reflect.TypeOf(slice).Elem() != reflect.TypeOf(value) {return slice, errors.New("index error")}if index == v.Len() {return reflect.Append(v, reflect.ValueOf(value)).Interface(), nil}v = reflect.AppendSlice(v.Slice(0, index+1), v.Slice(index, v.Len()))v.Index(index).Set(reflect.ValueOf(value))return v.Interface(), nil
}
func UpdateSliceByIndex(slice interface{}, index int, value interface{}) (interface{}, error) {v := reflect.ValueOf(slice)if v.Kind() != reflect.Slice {return slice, errors.New("not slice")}if index > v.Len()-1 || reflect.TypeOf(slice).Elem() != reflect.TypeOf(value) {return slice, errors.New("index error")}v.Index(index).Set(reflect.ValueOf(value))return v.Interface(), nil
}//备忘:切片指定位置插入和删除原理
func sliceInsertAndDelete() {//insertdata := []int{1, 2, 3, 4, 5}left := data[:3]right := data[3:]tmp := append([]int{}, left...)tmp = append(tmp, 0)res := append(tmp, right...)fmt.Println(res)//deletedata = []int{1, 2, 3, 4, 5}left = data[:3]right = data[3+1:]res = append(left, right...)fmt.Println(res)
}

GoLang封装常用工具方法相关推荐

  1. PHP常用工具方法集...

    PHP常用工具方法集,更新时间  2018-7-14 <?php /*** 常用工具方法集* Author: zj*//** 工具总述 1.加密解密 2.生成随机字符串 3.获取文件扩展名(后缀 ...

  2. jQuery常用工具方法

    前面的话 jQuery提供一些与元素无关的工具方法,不必选中元素,就可以直接使用这些方法.如果理解原生javascript的继承原理,那么就能理解工具方法的实质.它是定义在jQuery构造函数上的方法 ...

  3. 前端JS常用工具方法

    前端JS常用工具方法 // var ua = window.navigator.userAgent.toLowerCase(); /*** 前端JS常用工具方法* @class Tools*/ exp ...

  4. JavaScript常用工具方法封装

    因为工作中经常用到这些方法,所有便 JavaScript 1. type 类型判断 isString (o) { //是否字符串return Object.prototype.toString.cal ...

  5. webp格式怎么转换成jpg,3种常用工具方法

    在日常办公中,我们经常需要在网上找到一些图片进行编辑.但有时候我们会遇到Webp格式的图片,而有些软件无法直接编辑它们.Webp是一种由谷歌开发的图像文件格式,它提供了有损压缩和无损压缩(可逆压缩)的 ...

  6. 【数组方法大合集】原生js数组array常用工具方法大合集

    var array = {/* 数组求和*/sum: arr => eval(arr.join("+")),/* 判断一个数组(支持一个字符串)里面的是否有任何一个元素被包含 ...

  7. JS前端常用工具方法

    目录 1. 邮箱 2. 手机号码 3. 电话号码 4. URL地址 5. 是否字符串 6. 是否数字 7. 是否Boolean 8. 是否函数 9. 是否为null 10. 是否undefined 1 ...

  8. js常用工具方法utils

    申明:不是我写的,但是我忘记在那篇文章上找到的 记录下来 /*** 邮箱* @param {*} s*/ export const isEmail = (s) => {return /^([a- ...

  9. 前端JS常用工具方法 , 收藏

    再加几个常用的 计算百分比 /*** 计算百分比* @param {number} num 分子* @param {number} total 分母* @returns {number} 返回数百分比 ...

最新文章

  1. 深度复盘:AI 与脑科学的错位
  2. python好学嘛-Python好学吗?Python学习路线
  3. linux关于防火墙的一些知识
  4. cropper.js 图像旋转问题_快速提高前端开发效率:10个JavaScript图像处理库
  5. MATLAB 牛顿迭代算法
  6. 信息学奥赛一本通C++语言——1128:图像模糊处理
  7. java corba_Java编写CORBA的一个简单例子(CORBA入门)
  8. 计算机信息安全技术计算题,计算机信息安全技术练习题.doc
  9. 玛莎拉蒂品牌与酷客多小程序达成官方合作!
  10. Avast! 4 Server 服务器版license许可文件获得方法
  11. qgc地面站如何导入离线地图_【技术贴第三期】如何玩转离线地图?
  12. 无人深空java修改器,无人深空next存档修改-无人深空next存档修改器下载v1.5.0最新版-西西软件下载...
  13. C++:利用泰勒公式求cos x近似值
  14. 基于51单片机MAX31865的PT100铂电阻测温设计
  15. Chloe.ORM框架使用之查询(一)
  16. ros服务器打开网页变慢了,解决ros 在计算机没有限速情况下,有几个网站打开很慢,或者打不开。...
  17. Chrome 浏览器 模糊的解决方法
  18. vivado2020.1 vitis
  19. R语言可视化散点图、使用ggrepel包的geom_text_repel函数避免数据点之间的标签互相重叠(设置min.segment.length参数为Inf不添加标签线段)
  20. 达梦数据库大小写敏感介绍

热门文章

  1. python底层与机器底层关系_起底 Python 的底层逻辑
  2. 中国大学MOOC企业战略管理题库含答案
  3. 现代软件工程第三次作业-自我评价的改进
  4. CQUPT数据结构作业2.1:设有一如下定义的SqList类型的顺序表,将其中的数据元素按递增顺序排列.试写一算法,将x插入到顺序表的适当位置,以保持该表的有序性
  5. ImageJ如何对图像进行旋转
  6. ERP 软件项目验收流程
  7. ui设计的好网站(转载)
  8. 2021年中国工业互联网行业发展现状分析,“5G+工业互联网”驱动行业快速发展
  9. CES归来---话说AR眼镜
  10. 魔百和 机顶盒 UNT401H_IPTV刷机 亲测成功!