[英]Get length of an array in golang and store it in a const [duplicate]
我使用 go playground 来尝试这段代码:
package main
func main() {
exp := []string{"HELLO"}
const length = len(exp)
}
但它向我抛出了这个错误:
./prog.go:6:8: const 初始值设定项 len(exp) 不是常量
我可以看到这是因为 exp 的长度是可变的。 如何获取当前长度并将其存储在整数常量中?
我认为我需要反射模块来做到这一点,但我不知道该怎么做。 我尝试使用reflect.ValueOf
但它没有用。
exp := []string{"HELLO"}
const length = len(reflect.ValueOf(exp).Interface().([]string))
您确实可以获得当前长度,但根据定义,这不是常数。 以下是语言规范对此的说明:
表达
len(s)
是恒定的,如果s
是字符串常量。 如果s
的类型是数组或指向数组的指针,并且表达式s
不包含通道接收或(非常量)函数调用,则表达式len(s)
和cap(s)
是常量; 在这种情况下,不评估s
。 否则,len
和cap
调用不是常数,并且s
被评估。
由于您对len
的调用是len(exp)
我们必须针对上面的文本测试exp
:
len
产生常数的三种情况已经用尽,因此len
必然产生非常量。
如果您希望len
生成一个常量,则必须将其应用于字符串常量、数组或指向数组的指针。 数组在很多方面与切片相似,因此这是可能的。 例如,在您的示例中,只需替换:
exp := []string{"HELLO"}
和:
exp := [1]string{"HELLO"}
就足够了。 如果您希望编译器计算初始值设定项,使用...
就足够了:
exp := [...]string{"HELLO"}
请参阅Go Playground 上的示例。 请注意,因为exp
现在是一个数组,而不是一个切片,所以某些操作无法在exp
上/使用exp
执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.