Golang:如何将int转换为计算成time.duration

时间:2017-05-10 12:06:41

标签: go time casting flags

我是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的区别是什么?

1 个答案:

答案 0 :(得分:2)

由于assignability rules

grpc.WithTimeout(100*time.Second)grpc.WithTimeout(*connTimeout*time.Second)不会

后一个表达式不满足这些,前者满足

  • x是一个无类型常量,可由T类型的值表示。

规则