Go中的字符串是值而不是指针,并且被屏蔽掉了写操作。
s := "Hello"s[0] = 'L' // compile error: cannot assign to s[0]
字符串也是可以取地址,其运行逻辑和常规指针相同。
package mainimport "fmt"func main() {s := "Hello"t := &sfmt.Println(t)fmt.Println(*t)fmt.Println(s)*t += " World"fmt.Println(t)fmt.Println(*t)fmt.Println(s)}

关于Go字符串实现的猜测:
字符串和slice类似,都是一个包含长度和底层指针的组合类型,区别在于字符串中的修改操作被屏蔽掉了。
字符串本身是值,但是包含了底层指针,字符串切片生存的是新字符串,改变了len的值,也可能让起始指针的位置后移,但与原字符串共享了底层str内存。
package mainimport "fmt"func main() {s := "Hello"t := &sfmt.Println(*t)fmt.Println(t)s = s[:2]fmt.Println(s)fmt.Println(*t)fmt.Println(t)}

