duanliao2310
duanliao2310
2017-05-10 12:06
采纳率: 100%
浏览 2.7k
已采纳

Golang:如何将int转换为time.duration?

我是刚刚接触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)) 

但是,这会导致以下编译错误:

mismatched types int64 and time.Duration

很明显,我不能直接使用int 64标志变量来计算一个持续时间,但是一个单独的数字可以吗?最后,通过创建一个与时间相关的变量,我找到了一个使用标志变量的解决方案。

var timeoutduration = time.Duration(*distributorTimeout) * time.Second
    // create distributor connection
    conn, err := grpc.Dial(*connAddress,
        grpc.WithBlock(),
        grpc.WithTimeout(timeoutduration)) 

上述操作似乎如出一辙:只要给定命令行参数(默认为100),拨号就会尝试,并且会抛出无法建立连接的消息。

然而:为什么直接使用int 64标志变量计算时间是不可能的,换句话说,数字100和包含int 64的变量对于golang有什么区别?

图片转代码服务由CSDN问答提供 功能建议

我是GoLang的新手,但现在却茫然不知为何编译器不接受特定的代码行

我有一个在拨号时创建超时的工作示例:

  conn,err:= grpc.Dial(*  connAddress,
 grpc.WithInsecure(),
 grpc.WithBlock(),//将阻塞直到连接可用
 grpc.WithTimeout(100 * time.Second))//在100秒后超时
 <  / code>  
 
 

现在硬编码的100那里不是很好,所以我想通过一个标志使该命令行变量如下:

  connTimeout:= flag.Int64(“ connection-timeout”,100,“给出拨号连接x的超时时间”)
 ... 
 conn,err:= grpc.Dial(* connAddress,
  grpc.WithInsecure(),
 grpc.WithBlock(),
 grpc.WithTimeout(* connTimeout * time.Second))
   
 
 

但是,这给出了以下内容 编译错误:

t不匹配 是int64和time.Duration

因此,显然我不能直接使用int64标志变量来计算持续时间,但是数字可以吗?

最终我找到了一种通过创建与time.Duration有关的变量来使用flag变量的解决方案:

  var timeoutduration = time.Duration(* distributorTimeout)  * time.Second 
 //创建分配器连接
 conn,err:= grpc.Dial(* connAddress,
 grpc.WithBlock(),
 grpc.WithTimeout(timeoutduration))
   
 
 

上面的命令似乎按预期工作:只要给定命令行参数(默认为100),就会尝试拨号,然后抛出一条消息,提示无法建立连接。 很好。

但是:直接使用int64标志变量来计算时间是不可能的。持续时间,换句话说,数字100与变量之间的golang有什么区别? 包含int64?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dongshen6060
    dongshen6060 2017-05-10 12:21
    已采纳

    grpc.WithTimeout(100*time.Second) and grpc.WithTimeout(*connTimeout*time.Second) does not because of assignability rules:

    the latter expression satisfies none of those, and the former satisfies the

    • x is an untyped constant representable by a value of type T.

    rule

    点赞 评论

相关推荐