与 1 * time.Second 的奇怪问题

正在跟着 golang-book 修改自己的 Gorotine 的例子, 然后用到了 time 包下的 time.Sleep 函数, 然后问题就来了:

fmt.Printf("%T\n", 1 * time.Second)
a := 1
fmt.Printf("%T\n", a * time.Second)
var b int64 = 1
fmt.Printf("%T\n", b * time.Second)

大家猜猜上面会怎么样?

一个字面意的 int 与 time.Duration 得到的是 Duration struct, 而一个变量 int 与 time.Duration 则报告错误.

对于结果我非常的好奇, 是我有地方弄错没有理解? 还是这是一个特殊情况? 或者?

共 2 个回复


jimmykuu

time.Duration定义是type Duration int64,不是struct

在Go里面int和int64是不同的,int是平台相关的,在32位平台和64位平台不同,a := 1 Go会自动推导成int型,a * time.Second肯定不行

由于b是int64类型,虽然Duration是定义的int64,但是还是算两种类型,因此b * time.Second也不行

正确的做法是转换,time.Duration(b)*time.Second

第一个1*time.Secnod我暂时也解释不了

# 0

polaris

1、规范上明确说明:除了比较操作符外,其他二元操作符的操作数类型必须相同,除非该操作包含移位或含有无类型常量(比如例子中的1)。还说:如果两个操作数中,一个是无类型常量,另一个不是,则无类型常量会按常量转换规则进行转换。 2、常量可以转换为某种类型T的条件,其中一条是:该常量可以表示为T类型的值

所以,第一种1 * time.Second没有问题,而其他情况必须做显示类型转换。

# 1