网站系统,2022年下半年软考停考地区,自助模块化网站建设,上海比较有名的设计公司文章目录 前言推荐阅读 前言
最近有读者留言说#xff0c;平时在写代码的过程中#xff0c;是会对字符串进行修改的#xff0c;但网上都说 Go 语言字符串是不可变的#xff0c;这是为什么呢#xff1f;
这个问题本身并不困难#xff0c;但对于新手来说确实容易产生困惑… 文章目录 前言推荐阅读 前言
最近有读者留言说平时在写代码的过程中是会对字符串进行修改的但网上都说 Go 语言字符串是不可变的这是为什么呢
这个问题本身并不困难但对于新手来说确实容易产生困惑今天就来回答一下。
首先来看看它的底层结构
type stringStruct struct {str unsafe.Pointerlen int
}和切片的结构很像只不过少了一个表示容量的 cap 字段。
str指向一个 []byte 类型的指针len字符串的长度
所以当我们定义一个字符串
s : Hello World那么它在内存中存储是这样的
当我们在程序中对字符串进行重新赋值时比如这样
s : Hello Worlds 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 语言教程–介绍一Go 语言教程–语言结构二Go 语言教程–语言结构三Go 语言教程–数据类型四Go 语言教程–语言变量五Go 语言教程–GO语言常量六Go 语言教程–GO语言运算符七Go 语言教程–GO条件和循环语句八Go 语言教程–GO语言函数九Go 语言教程–GO语言变量作用域十Go 语言教程–GO语言数组十一Go 语言教程–GO语言指针十二Go 语言教程–GO语言结构体十三Go 语言教程–GO语言切片(Slice)十四Go 语言教程–Go 语言范围(Range)十五Go 语言教程–Go 语言Map(集合)十六Go 语言教程–Go 语言递归函数十七Go 语言教程–Go 语言类型转换十八Go 语言教程–Go 语言接口十九Go 语言教程–Go 错误处理二十Go 语言教程–Go 并发二十一