package main
import (
"fmt"
)
func main(){
var str string = "hello,world"
fmt.Println(&str)
fmt.Println(&str[0])
}
我在golang完全是个新手。刚开始学了几天。这是我的问题:
编译错误:无法获取str[0]的地址
我搜索了〈〈the way to go〉〉,它说不能取字符串中字符的地址,为什么不允许呢?
另一个令人困惑的问题是,一旦你创建了一个字符串,你就不能再修改它了。这是否意味着这个字符串是在恒定的空间中呢?
3条答案
按热度按时间aiqt4smr1#
是的,这是正确的,在Go文档中可以看到
字符串类型表示字符串值的集合。字符串值是字节序列(可能为空)。字符串是不可变的:字符串一旦被创建,就不可能改变它的内容。2预先声明的字符串类型是string。
字符串s的长度(以字节为单位)可以使用内置函数len来发现。如果字符串是常量,则长度是编译时常量。字符串的字节可以通过整数索引0到len(s)-1来访问。获取这样一个元素的地址是非法的;如果s[i]是字符串的第i个字节,则&s[i]无效。
我希望这能消除你的疑虑
liwlm1x92#
为了让将来的读者更清楚地了解这个问题的答案,访问像
&s[i]
这样的字符串的第i个字节的地址是无效的,因为字符串是不可变的,如果你能得到地址,那么字符串就可以被改变。同样的逻辑也适用于文字字符串。
这可能看起来很奇怪,但如果你把它看作一个常量,它就更有意义了。为了一致性,你必须允许取其他常量的地址,比如
&42
或&true
。hkmswyz63#
内置类型字符串,其基础结构被反射。StringHeader
数据(uinptr),是字符串内容内存地址
试试这个: