我们已经编写了一个程序,通过这个程序我们试图找到一个常数的地址.有可能这样做吗?
package main
func main() {
const k = 5
address := &k
}
它会给出一个错误,谁能告诉我们怎么才能找到一个常量的地址?
我们已经编写了一个程序,通过这个程序我们试图找到一个常数的地址.有可能这样做吗?
package main
func main() {
const k = 5
address := &k
}
它会给出一个错误,谁能告诉我们怎么才能找到一个常量的地址?
简而言之:you can't.
错误信息显示:
不能取k的地址
地址运算符&
的操作数存在限制.Spec: Address operators:个
对于类型
T
的操作数x
,地址操作&x
生成类型*T
到x
的指针.操作数必须是addressable,即变量、指针间接或片索引操作;或可寻址 struct 操作数的字段 Select 器;或可寻址数组的数组索引操作.作为可寻址要求的例外,x
也可以是(可能带括号的)composite literal.如果x
的求值会导致run-time panic,那么&x
的求值也会导致run-time panic.
常量not被列为addressable,而规范中没有列为addressable(上面引用)的cannot则是地址运算符&
的操作数(不能获取它们的地址).
不允许取常量的地址.这有两个原因:
如果你需要一个指针指向一个等于该常数的值,把它赋给一个可寻址的变量,这样你就可以得到它的地址,例如.
func main() {
const k = 5
v := k
address := &v // This is allowed
}
但是要知道,在围棋中,数值常量表示任意精度的值,并且不会溢出.当您将常量的值赋给变量时,这可能是不可能的(例如,常量可能大于您为其赋值的变量类型的最大值,从而导致编译时错误),或者它可能不相同(例如,在浮点常量的情况下,它可能会失go 精度).