繁体   English   中英

在 golang 中获取数组的长度并将其存储在 const [重复]

[英]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 否则, lencap调用不是常数,并且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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM