我是GoLang的新手,目前还不知道为什么编译器不接受特定的代码行。
我有一个工作示例,用于在拨号时创建超时:
conn, err := grpc.Dial(*connAddress,
grpc.WithInsecure(),
grpc.WithBlock(), // will block till the connection is available
grpc.WithTimeout(100*time.Second)) // times out after 100 seconds
现在硬编码100还不好,所以我想通过一个标志来制作一个命令行变量,如下所示:
connTimeout := flag.Int64("connection-timeout", 100, "give the timeout for dialing connection x")
...
conn, err := grpc.Dial(*connAddress,
grpc.WithInsecure(),
grpc.WithBlock(),
grpc.WithTimeout(*connTimeout*time.Second))
但是这会产生以下编译错误:
不匹配的类型int64和time.Duration
所以显然我不能直接使用int64标志变量来计算持续时间,但数字可以吗?
最终我找到了一个解决方案,通过首先创建一个与time.Duration相关的变量来使用flag变量:
var timeoutduration = time.Duration(*distributorTimeout) * time.Second
// create distributor connection
conn, err := grpc.Dial(*connAddress,
grpc.WithBlock(),
grpc.WithTimeout(timeoutduration))
以上似乎按预期工作:只要给出命令行参数(默认为100),就会尝试拨号,并抛出无法建立连接的消息。好。
但是:如何直接使用int64标志变量来计算time.Duration,换句话说,数字100和包含int64的变量之间golang的区别是什么?
答案 0 :(得分:2)
grpc.WithTimeout(100*time.Second)
和grpc.WithTimeout(*connTimeout*time.Second)
不会
后一个表达式不满足这些,前者满足
x
是一个无类型常量,可由T
类型的值表示。规则