Go常用工具代码

137 阅读4分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

开发过程中,常常会需要用到一些工具方法,比如时间戳转字符串,数字转时间,时间格式转换,字符和数字互转,json 字符串与map 互转等。

时间戳常用方法

import (
   "time"
   "fmt"
)
 
func main() {
   //获取当前时间
   t := time.Now() //2018-07-11 15:07:51.8858085 +0800 CST m=+0.004000001
   fmt.Println(t)
 
   //获取当前时间戳
   fmt.Println(t.Unix()) //1531293019
 
   //获得当前的时间
   fmt.Println(t.Uninx().Format("2006-01-02 15:04:05"))  //2018-7-15 15:23:00
 
   //时间 to 时间戳
   loc, _ := time.LoadLocation("Asia/Shanghai")        //设置时区
   tt, _ := time.ParseInLocation("2006-01-02 15:04:05", "2018-07-11 15:07:51", loc) //2006-01-02 15:04:05是转换的格式如php的"Y-m-d H:i:s"
   fmt.Println(tt.Unix())                             //1531292871
 
   //时间戳 to 时间
   tm := time.Unix(1531293019, 0)
   fmt.Println(tm.Format("2006-01-02 15:04:05")) //2018-07-11 15:10:19
 
   //获取当前年月日,时分秒
   y := t.Year()                 //年
   m := t.Month()                //月
   d := t.Day()                  //日
   h := t.Hour()                 //小时
   i := t.Minute()               //分钟
   s := t.Second()               //秒
   fmt.Println(y, m, d, h, i, s) //2018 July 11 15 24 59

时间戳&字符串互转

日常开发中,我们时常会遇到类型转换, 比如 string, int, int64 float 类型之间相互转换。

package main

import (
	"fmt"
	"time"
)

func main() {
	//1、时间戳转时间
	nowUnix := time.Now().Unix() //获取当前时间戳
	nowStr := unixToStr(nowUnix, "2006-01-02 15:04:05")
	fmt.Printf("1、时间戳转时间:%d => %s \n", nowUnix, nowStr)

	//2、时间转时间戳
	nowStr = time.Now().Format("2006/01/02 15:04:05") //根据指定的模板[ 2006/01/02 15:04:05 ],返回时间。
	nowUnix, err := strToUnix(nowStr, "2006/01/02 15:04:05")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("2、时间转时间戳:%s => %d", nowStr, nowUnix)
}

//时间戳转时间
func unixToStr(timeUnix int64, layout string) string {
	timeStr := time.Unix(timeUnix, 0).Format(layout)
	return timeStr
}

//时间转时间戳
func strToUnix(timeStr, layout string) (int64, error) {
	local, err := time.LoadLocation("Asia/Shanghai") //设置时区
	if err != nil {
		return 0, err
	}
	tt, err := time.ParseInLocation(layout, timeStr, local)
	if err != nil {
		return 0, err
	}
	timeUnix := tt.Unix()
	return timeUnix, nil
}

字符串&数字互转

数字互串,关键在与精度问题, 主要方法有 ParseFloatFormatFloat

strconv.ParseInt("1210",10,64)

n, err := strconv.Atoi(v)


	a := 112
	b := 100
	value, _ := strconv.ParseFloat(fmt.Sprintf("%.4f", float64(a) / float64(b)), 64)
	fmt.Println(value)

字符串转换成 float

strconv.FormatFloat(str, 'f', 2, 64)

字符串截取

字符串截取有个坑,需要注意一下: 截取方法:

strings.Split(str, "分隔符")

例子:

str := "Zk;5cp;"

当用 ; 去拆分后,你会发现拆分后的数组len() 为3, 而不是2.

其次还有注意一点:

	s := strings.Split("", ",")
	fmt.Println(s, len(s))

返回的 len 长度竟然是 1

    s := strings.Split("", "")
    fmt.Println(s, len(s))

    s = strings.Split("abc,abc", "")
    fmt.Println(s, len(s))

    s = strings.Split("", ",")
    fmt.Println(s, len(s))

    s = strings.Split("abc,abc", ",")
    fmt.Println(s, len(s))

    s = strings.Split("abc,abc", "|")
    fmt.Println(s, len(s))

    fmt.Println(len(""))
    fmt.Println(len([]string{""}))

    str := ""
    fmt.Println(str[0])

运行结果如下:

[] 0 //返回空数组
[a b c , a b c] 7 //返回7个数组元素
[] 1 //返回一个包含空字符元素的数组, 数组长度是1
[abc abc] 2
[abc,abc] 1
0
1
panic: runtime error: index out of range

string & json 互转

1.结构体转map 2.map转结构体 3.结构体数据转移到结构体 4.json字符串转结构体

package main

import (
	"encoding/json"
	"fmt"
	"reflect"
)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	//1、结构体转map
	user1:=User{}
	user1.Name="小明"
	user1.Age=18
	mp:=make(map[string]interface{})
	err:=Transfer(user1,&mp)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(mp)

	//2、map转结构体
	user2:=User{}
	err=Transfer(mp,&user2)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(user2)

	//3、结构体数据转移
	user3:= struct {//匿名结构体
		Name string `json:"name"`
	}{}
	err=Transfer(user1,&user3)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(user3)

	//4、json字符串转结构体, json字符串转map也是如此方式
	str:="{\"name\":\"小红\",\"age\":17}"
	user4:=User{}
	err=Transfer(str,&user4)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(user4)

}
//转换方法
func Transfer(beConverted, converted interface{}) error {
	t:=reflect.TypeOf(beConverted)
	var bt []byte
	var err error
	if t.Name()=="string" {
		bt=[]byte(beConverted.(string))
	}else {
		bt,err=json.Marshal(beConverted)
		if err != nil {
			return err
		}
	}
	err=json.Unmarshal(bt,converted)
	if err != nil {
		return err
	}
	return nil
}

map 排序

m := map[string]int{"Alice": 23, "Eve": 2, "Bob": 25}

keys := make([]string, 0, len(m))
for k := range m {
	keys = append(keys, k)
}
sort.Strings(keys)

for _, k := range keys {
	fmt.Println(k, m[k])
}

当然,如不想自己写工具包, 有如下推荐:

gotool 包推荐

gotool是一个小而全的Golang工具集,主要是将日常开发中常用的到方法进行提炼集成,避免重复造轮子,提高工作效率,每一个方法都是作者经过工作经验,和从以往的项目中提炼出来的。

安装

go get github.com/druidcaesa/gotool
go.mod github.com/druidcaesa/gotool