go语言字符串不能修改
总结
- Go 语言中的字符串和其他高级语言(Java、C#)一样,默认是不可变的(immutable)。
- 字符串不可变有很多好处:
- 如天生线程安全,大家使用的都是只读对象,无须加锁;
- 再者,方便内存共享,而不必使用写时复制(Copy On Write)等技术;
- 字符串 hash 值也只需要制作一份。
- 修改字符串时,可以将字符串转换为 []byte 进行修改。
- []byte 和 string 可以通过强制类型转换互转。
var str string = "hello"
str[0] = 'H' // Cannot assign to str[0] 编译(编辑器)报错
切片的内容是可修改的,通过将string转换为[]byte切片,再修改切片内容,再转换回string
var str string = "hello"
strBytes := []byte(str)
strBytes[0] = 'H'
str = string(strBytes)
fmt.Println(str)
在完成了对 []byte 操作后,在第 9 行,使用 string() 将 []byte 转为字符串时,重新创造了一个新的字符串。最终str整体赋值为一个新的string
扩展 字符串底层结构
字符串底层结构定义在源码runtime包下的 string.go 文件中:
// src/runtime/string.go
type stringStruct struct {
str unsafe.Pointer
len int
}
【go语言字符串不能修改】str:一个指针,指向存储实际字符串的内存地址。
len:字符串的长度。可使用len()函数获取这个值。注意,len存储实际的字节数,而非字符数。所以对于非单字节编码的字符,结果可能让人疑惑。
对于字符串Hello,实际底层结构如下:
文章图片
推荐阅读
- 2018-02-06第三天|2018-02-06第三天 不能再了,反思到位就差改变
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 良心
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 字符串拼接成段落,换行符(\n)如何只执行n-1次
- 不能坚持的理由