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

各位,我在用golang redis set一些数据。使用的是gopkg.in/redis.v4
用法:c.Set(uid + ":policy", b, exp * time.Second)
这里有个问题 这个exp 之前是字符串 我转成 int -->exp, _ := strconv.Atoi(policy.Exp)
然后 我用 exp * time.Second 报错:invalid operation: time.Second 乘以 exp (mismatched types time.Duration and int)

我自己 hard code 手写一个 数字相乘 700 乘以 time.Second 是 ok的。但是 exp就不行,我看了 700 和 exp的数据类型 都是 int 求教是怎么回事,顺便说一下 exp的值也是700 谢谢

阅读 9.4k
2 个回答

这其实是一个隐含的常量和非常量类型转换问题,先看下时间定义

type Duration int64
const (
    Nanosecond  Duration = 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这样使用


// Common durations. There is no definition for units of Day or larger
// to avoid confusion across daylight savings time zone transitions.
//
// To count the number of units in a Duration, divide:
//    second := time.Second
//    fmt.Print(int64(second/time.Millisecond)) // prints 1000
//
// To convert an integer number of units to a Duration, multiply:
//    seconds := 10
//    fmt.Print(time.Duration(seconds)*time.Second) // prints 10s
//
const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)

看一下重点To convert an integer number of units to a Duration下边的部分.

time.Second * 1这个片段中,1并不是int,也不是int64,而是无类型常量,相当于const exp = 1time.Second * a.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏