关于golang:go语言字符串不能修改

5次阅读

共计 721 个字符,预计需要花费 2 分钟才能阅读完成。

总结

  • 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
  }

str:一个指针,指向存储理论字符串的内存地址。
len:字符串的长度。可应用 len() 函数获取这个值。留神,len 存储理论的字节数,而非字符数。所以对于非单字节编码的字符,后果可能让人纳闷。
对于字符串 Hello,理论底层构造如下:

正文完
 0