论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
为什么说 Go 语言字符串是不可变的?
为什么说 Go 语言字符串是不可变的?
涛声依旧在
金牌会员
|
2023-6-2 21:46:36
|
显示全部楼层
|
阅读模式
楼主
主题
831
|
帖子
831
|
积分
2493
原文链接:
为什么说 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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
涛声依旧在
金牌会员
这个人很懒什么都没写!
楼主热帖
MySQL基本SQL语句之高级操作
maven配置步骤及问题
一文读懂K-Means原理与Python实现 ...
IOS OpenGL ES GPUImage 图像黑白色调 ...
史上最全MongoDB之部署篇
Flink-基于 DataStream API 实现欺诈检 ...
大数据ETL开发之图解Kettle工具(入门 ...
Java 2023年接地气的中高级面试题一( ...
学习ASP.NET Core Blazor编程系列二十 ...
Juc并发编程12——2万字深入源码:线程 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表