我曾经去过游乐场尝试以下代码:
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))
答案 0 :(得分:5)
您确实可以获取当前长度,但是根据定义,这不是常数。 Here is what the language specification has to say about this:
如果
len(s)
是字符串常量,则表达式s
为constant。如果len(s)
的类型是数组或指向数组的指针,并且表达式cap(s)
不包含channel receives或(,则表达式s
和s
是常量。非恒定)function calls;在这种情况下,s
不会被评估。否则,len
和cap
的调用不是恒定的,并且会评估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
执行某些操作。