为了账号安全,请及时绑定邮箱和手机立即绑定

golang 数字与时间相乘与redis的问题

golang 数字与时间相乘与redis的问题

慕婉清6462132 2019-05-10 15:25:16
各位,我在用golangredisset一些数据。使用的是gopkg.in/redis.v4用法:c.Set(uid+":policy",b,exp*time.Second)这里有个问题这个exp之前是字符串我转成int-->exp,_:=strconv.Atoi(policy.Exp)然后我用exp*time.Second报错:invalidoperation:time.Second乘以exp(mismatchedtypestime.Durationandint)我自己hardcode手写一个数字相乘700乘以time.Second是ok的。但是exp就不行,我看了700和exp的数据类型都是int求教是怎么回事,顺便说一下exp的值也是700谢谢
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

这其实是一个隐含的常量和非常量类型转换问题,先看下时间定义
typeDurationint64
const(
NanosecondDuration=1
Microsecond=1000*Nanosecond
Millisecond=1000*Microsecond
Second=1000*Millisecond
Minute=60*Second
Hour=60*Minute
)
再看这里
常量和Duration相乘
700*time.Duration
非常量和Duration相乘
exp:=700
exp*time.Duration
为了能够完成相乘,必须先把类型转成一致,所以就是能否转成类型Duration的问题:700(常量)->Duration,700在Duration取值范围内,因此可以转换exp(int类型)->Duration,go中不同类型必须强制转换,因此报错
顺便说一句,文档推荐time.Duration(700)*time.Second这样使用
                            
查看完整回答
反对 回复 2019-05-10
?
HUX布斯

TA贡献1876条经验 获得超6个赞

//Commondurations.ThereisnodefinitionforunitsofDayorlarger
//toavoidconfusionacrossdaylightsavingstimezonetransitions.
//
//TocountthenumberofunitsinaDuration,divide:
//second:=time.Second
//fmt.Print(int64(second/time.Millisecond))//prints1000
//
//ToconvertanintegernumberofunitstoaDuration,multiply:
//seconds:=10
//fmt.Print(time.Duration(seconds)*time.Second)//prints10s
//
const(
NanosecondDuration=1
Microsecond=1000*Nanosecond
Millisecond=1000*Microsecond
Second=1000*Millisecond
Minute=60*Second
Hour=60*Minute
)
看一下重点ToconvertanintegernumberofunitstoaDuration下边的部分.
time.Second*1这个片段中,1并不是int,也不是int64,而是无类型常量,相当于constexp=1和time.Second*a.
                            
查看完整回答
反对 回复 2019-05-10
  • 2 回答
  • 0 关注
  • 934 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信