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

时间:2020-02-16 00:14:48

标签: go

我曾经去过游乐场尝试以下代码:

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))

1 个答案:

答案 0 :(得分:5)

您确实可以获取当前长度,但是根据定义,这不是常数。 Here is what the language specification has to say about this

如果len(s)是字符串常量,则表达式sconstant。如果len(s)的类型是数组或指向数组的指针,并且表达式cap(s)不包含channel receives或(,则表达式ss是常量。非恒定)function calls;在这种情况下,s不会被评估。否则,lencap的调用不是恒定的,并且会评估s

由于您对len的调用与len(exp)相同,因此我们必须针对以上文本测试exp

  • 它是字符串常量吗?没有;这是一片。
  • 是数组吗?没有;这是一片。
  • 它是指向数组的指针吗?不,这是一片。

len会产生恒定的三种情况已经用尽,因此len必须产生非恒定

如果您希望len产生一个常量,则必须将其应用于字符串常量,数组或指向数组的指针。数组在很多方面都类似于切片,因此 是可能的。例如,在您的示例中,只需替换:

exp := []string{"HELLO"}

具有:

exp := [1]string{"HELLO"}

足够了。您是否希望编译器使用...来计算初始化程序:

exp := [...]string{"HELLO"}

请参见example on Go Playground。请注意,由于exp现在是一个数组,而不是一个切片,因此无法在exp上/使用DF1 user_id movie_id 0 1 242 1 2 302 2 1 377 3 3 51 4 1 346 ... ... ... 100000 rows × 2 columns 执行某些操作。