【问题标题】:cap() on channel is not constant?通道上的 cap() 不是恒定的?
【发布时间】:2015-04-19 15:47:53
【问题描述】:
ch := make(chan int, 10)
fmt.Println(cap(ch))

是函数调用cap(ch)常量还是求值

golang 规范说:

如果 s 是字符串常量,则表达式 len(s) 是常量。如果 s 的类型是数组或指向数组的指针并且表达式 s 不包含通道接收或(非常量)函数调用,则表达式 len(s) 和 cap(s) 是常量;在这种情况下,不评估 s。否则,对 len 和 cap 的调用不是常量,并且会评估 s。

似乎是评估

【问题讨论】:

  • 它在一般情况下被评估,尽管在这个特定的例子中,如果编译器将它优化为一个常量,我不会感到惊讶。
  • @Evan OP 询问在频道上调用 cap() 是否是一个常量表达式,因为在某些地方只允许使用常量表达式。即使编译器可以将对cap() 的调用优化为常量,也不会使调用成为常量表达式。

标签: go


【解决方案1】:

是的,cap() 在应用于通道时不是恒定的,因为通道的容量未编码在类型中,因此在编译时不知道。

【讨论】:

    【解决方案2】:

    肯定调用 cap(ch) 评估,只是因为

    ch := make(chan int, 10)
    fmt.Println(cap(ch))
    ch = make(chan int, 9)
    fmt.Println(cap(ch))
    

    证明链接https://play.golang.org/p/R0TfCpC-4L

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      相关资源
      最近更新 更多