Golang 中一个 time.Duration 相关类型转换问题

958 阅读1分钟

int (const 和 非const) 转换为 time.Duration 这是一个常见的操作,但是我们会遇到以下代码中的问题,对于初学者甚是疑惑,这里对其进行简单的'刨根'~

问题

```
	package main
	import (
		"fmt"
		"reflect"
		"time"
	)
	const a = 1
	func test(a time.Duration) {
		fmt.Printf("%v \n", a)
	}
	func main() {
		b := a + 1
		fmt.Printf("---- a = %v \n", reflect.TypeOf(a))
		test(a)
		fmt.Printf("---- b = %v \n", reflect.TypeOf(b))
		// test(b)  //> 打开注释后, 会编译不通过
	}
```

原因 (官方文档,见 reference)

Assignability
	A value x is assignable to a variable of type T ("x is assignable to T") if one of the following conditions applies:
		- x's type is identical to T.
		- x's type V and T have identical underlying types and at least one of V or T is not a defined type.
		- T is an interface type and x implements T.
		- x is a bidirectional channel value, T is a channel type, x's type V and T have identical element types, and at least one of V or T is not a defined type.
		- x is the predeclared identifier nil and T is a pointer, function, slice, map, channel, or interface type.
		- x is an untyped constant representable by a value of type T.	

就是说,在 const 修饰的变量如果没有明确指明类型时,会根据需要做类型转换; 而非 const 修饰的变量不会。这就可以解释上述代码中的疑惑了。

Reference

欢迎交流学习~