通道上的cap()不是常数?

时间:2015-04-19 15:47:54

标签: go

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

是函数调用cap(ch) 常量还是评估

golang spec说:

  

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

似乎是评估

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

确定的呼叫上限(ch)被评估,仅仅是因为

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

Proof-link https://play.golang.org/p/R0TfCpC-4L