「这是我参与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
}
字符串&数字互转
数字互串,关键在与精度问题, 主要方法有 ParseFloat 和 FormatFloat 。
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