Go语言 取字符串中字符的地址

f2uvfpb9  于 2023-02-27  发布在  Go
关注(0)|答案(3)|浏览(323)
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〉〉,它说不能取字符串中字符的地址,为什么不允许呢?
另一个令人困惑的问题是,一旦你创建了一个字符串,你就不能再修改它了。这是否意味着这个字符串是在恒定的空间中呢?

aiqt4smr

aiqt4smr1#

是的,这是正确的,在Go文档中可以看到
字符串类型表示字符串值的集合。字符串值是字节序列(可能为空)。字符串是不可变的:字符串一旦被创建,就不可能改变它的内容。2预先声明的字符串类型是string。
字符串s的长度(以字节为单位)可以使用内置函数len来发现。如果字符串是常量,则长度是编译时常量。字符串的字节可以通过整数索引0到len(s)-1来访问。获取这样一个元素的地址是非法的;如果s[i]是字符串的第i个字节,则&s[i]无效。
我希望这能消除你的疑虑

liwlm1x9

liwlm1x92#

为了让将来的读者更清楚地了解这个问题的答案,访问像&s[i]这样的字符串的第i个字节的地址是无效的,因为字符串是不可变的,如果你能得到地址,那么字符串就可以被改变。
同样的逻辑也适用于文字字符串。

s := "stack overflow"
fmt.Println(&s) // works

fmt.Println(&"hello, world") // runtime error

这可能看起来很奇怪,但如果你把它看作一个常量,它就更有意义了。为了一致性,你必须允许取其他常量的地址,比如&42&true

hkmswyz6

hkmswyz63#

内置类型字符串,其基础结构被反射。StringHeader
数据(uinptr),是字符串内容内存地址
试试这个:

(*reflect.StringHeader)(unsafe.Pointer(strPtr)).Data

相关问题