当我编译这段代码时,编译器告诉我我 不能使用str(s)的地址 。
func main() { s := "hello, world" type str string sp := &str(s) }
所以我的问题是 类型转换 是否会寻找新地址来定位当前的new s,还是我没有想到的其他东西?
s
Go编程语言规范 表达方式 表达式通过将运算符和函数应用于操作数来指定值的计算。 转换次数 转换是形式为T(x)的表达式,其中T是类型,x是可以转换为类型T的表达式。 地址运算符 对于类型T的操作数x,地址操作&x生成指向 T的类型 T的指针。操作数必须是可寻址的,即变量,指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。除可寻址性要求外,x还可为(可能带有括号的)复合文字。如果对x的求值会引起运行时恐慌,那么对&x的求值也是如此。
Go编程语言规范
表达方式
表达式通过将运算符和函数应用于操作数来指定值的计算。
转换次数
转换是形式为T(x)的表达式,其中T是类型,x是可以转换为类型T的表达式。
地址运算符
对于类型T的操作数x,地址操作&x生成指向 T的类型 T的指针。操作数必须是可寻址的,即变量,指针间接寻址或切片索引操作;或可寻址结构操作数的字段选择器;或可寻址数组的数组索引操作。除可寻址性要求外,x还可为(可能带有括号的)复合文字。如果对x的求值会引起运行时恐慌,那么对&x的求值也是如此。
表达式是临时的临时值。表达式值没有地址。它可以存储在寄存器中。转换是一种表达。例如,
package main import ( "fmt" ) func main() { type str string s := "hello, world" fmt.Println(&s, s) // error: cannot take the address of str(s) sp := &str(s) fmt.Println(sp, *sp) }
输出:
main.go:13:8: cannot take the address of str(s)
要寻址,值必须像变量一样是持久的。例如,
package main import ( "fmt" ) func main() { type str string s := "hello, world" fmt.Println(&s, s) ss := str(s) sp := &ss fmt.Println(sp, *sp) }
0x1040c128 hello, world 0x1040c140 hello, world