Go中的字符串是值而不是指针,并且被屏蔽掉了写操作。

    1. s := "Hello"
    2. s[0] = 'L' // compile error: cannot assign to s[0]

    字符串也是可以取地址,其运行逻辑和常规指针相同。

    1. package main
    2. import "fmt"
    3. func main() {
    4. s := "Hello"
    5. t := &s
    6. fmt.Println(t)
    7. fmt.Println(*t)
    8. fmt.Println(s)
    9. *t += " World"
    10. fmt.Println(t)
    11. fmt.Println(*t)
    12. fmt.Println(s)
    13. }

    截屏2021-11-24 上午10.56.26.png
    关于Go字符串实现的猜测:
    字符串和slice类似,都是一个包含长度和底层指针的组合类型,区别在于字符串中的修改操作被屏蔽掉了。
    字符串本身是值,但是包含了底层指针,字符串切片生存的是新字符串,改变了len的值,也可能让起始指针的位置后移,但与原字符串共享了底层str内存。

    1. package main
    2. import "fmt"
    3. func main() {
    4. s := "Hello"
    5. t := &s
    6. fmt.Println(*t)
    7. fmt.Println(t)
    8. s = s[:2]
    9. fmt.Println(s)
    10. fmt.Println(*t)
    11. fmt.Println(t)
    12. }

    截屏2021-11-24 上午11.08.05.png