乐趣区

关于go:为什么说-Go-语言字符串是不可变的

原文链接: 为什么说 Go 语言字符串是不可变的?

最近有读者留言说,平时在写代码的过程中,是会对字符串进行批改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?

这个问题自身并不艰难,但对于老手来说的确容易产生困惑,明天就来答复一下。

首先来看看它的底层构造:

type stringStruct struct {
    str unsafe.Pointer
    len int
}

和切片的构造很像,只不过少了一个示意容量的 cap 字段。

  • str:指向一个 []byte 类型的指针
  • len:字符串的长度

所以,当咱们定义一个字符串:

s := "Hello World"

那么它在内存中存储是这样的:

当咱们在程序中对字符串进行从新赋值时,比方这样:

s := "Hello World"

s = "Hello AlwaysBeta"

底层的存储就变成了这样:

Go 实际上是从新创立了一个 []byte{} 切片,而后让指针指向了新的地址。

更间接一点,咱们间接批改字符串中的单个字符,比方:

s := "Hello World"
s[0] = 'h'

这样做的话,会间接报错:

cannot assign to s[0] (strings are immutable)

如果肯定要这么做的话,须要对字符串进行一个转换,转换成 []byte 类型,批改之后再转换回 string 类型:

s := "Hello World"
sBytes := []byte(s)
sBytes[0] = 'h'
s = string(sBytes)

这样就能够了。

以上就是本文的全部内容,如果感觉还不错的话欢送 点赞 转发 关注,感激反对。


举荐浏览:

  • Go 语言 map 如何程序读取?
  • Go 语言 map 是并发平安的吗?
  • Go 语言切片是如何扩容的?
  • Go 语言数组和切片的区别
  • Go 语言 new 和 make 关键字的区别
  • 为什么 Go 不反对 []T 转换为 []interface
  • 为什么 Go 语言 struct 要应用 tags
退出移动版