首页 > 其他分享 >为什么说 Go 语言字符串是不可变的?

为什么说 Go 语言字符串是不可变的?

时间:2023-06-02 19:44:30浏览次数:35  
标签:语言 字符串 Go World byte Hello

原文链接: 为什么说 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,World,byte,Hello
From: https://www.cnblogs.com/alwaysbeta/p/17452785.html

相关文章

  • Leetcode 2559. 统计范围内的元音字符串数
    题目:给你一个下标从0开始的字符串数组words以及一个二维整数数组queries。每个查询queries[i]=[l,r]会要求我们统计在words中下标在l到r范围内(包含这两个值)并且以元音开头和结尾的字符串的数目。返回一个整数数组,其中数组的第i个元素对应第i个查询的答案......
  • goto语句
    跳转语句C语言的跳转语句主要包括continue,break,retuen,还有就是goto啦goto语句goto语句是在所有跳转语句中最自由的一种,但在大型工程和多人协作工程中并不推荐,原因就在于它太过于自由,会导致代码的可读性变得较差但这也无法撼动goto语句的地位合理的使用goto会大大简......
  • C++字符串分割和C语言常用格式控制
    C++string的输出格式控制输出一个字符串:左对齐,字宽为10,空格填充1.strings;2.cin>>s;3.cout<<std::left<<setw(10)<<setfill('*')<<s<<endl;输入:love输出效果:love******C++string字符流字符分割技巧输入一行字符串,然后按某个字符分割成若干子串1.strings;......
  • Angular Google Charts教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介GoogleCharts是一个纯粹的基于JavaScript的图表库,旨在通过添加交互式图表功能来增强Web应用程序.它支持各种图表.在Chrome,Firefox,Safari,InternetExplorer(IE)等标准浏览器中使用SVG绘制图表.在传统的IE6中,VML用于绘制图形.AngularGoogleCharts是一个基于开源角度......
  • 基于Django的博客系统
    基django的博客系统,界面展示首页前端界面如下:文章页面:后台页面:文章页面:##项目结构图代码主要文件结构如下:分别介绍下各个目录:accounts:用户模块blog:博客模块comments:评论模块oauth:第三方登录模块owntracks:owntracks位置追踪模块servermanager:服务管理模块templates:页面文......
  • django_web(上)
    建立数据库fromdjango.dbimportmodels#Createyourmodelshere.classAdmin(models.Model):username=models.CharField(verbose_name='用户名',max_length=32)password=models.CharField(verbose_name='密码',max_length=64)classDepartme......
  • 【C语言】动态内存管理函数的 深度解析 #是不是对数组不能变大变小而烦恼呢?学会动态内
    前言动态内存管理函数可以说很好用,但是有些小危险。所谓动态内存分配,就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求......
  • Golang - 选项模式 vs 构建器模式
    在使用Golang创建复杂对象时,常用的两种模式是选项模式(Optionspattern)和构建器模式(Builderpattern)。这两种模式各有优缺点,选择适合项目需求的模式取决于具体情况。问题假设我们想创建一个具有许多可选参数的复杂对象。一种方法是创建一个构造函数,该构造函数接受所有参数,并为可......
  • Linux 安装 mongodb
    1.下载wgethttps://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.6.tgz2.安装依赖yuminstalllibcurlopensslxz-libs3.解压tar-zxvfmongodb-linux-x86_64-rhel70-6.0.6.tgz4.复制文件并改名mvmongodb-linux-x86_64-rhel70-6.0.6/usr/local/mo......
  • mongodb安装和配置
    1、下载mongodbhttps://www.mongodb.org/dl/linux/x86_64-rhel62?_ga=2.188218154.323484055.1507690032-19904153.15011199572、安装mongodbtar-zxvfmongodb-linux-x86_64-rhel62-3.4.9.gzmvmongodb-linux-x86_64-rhel62-3.4.9mongodb-3.4.9mk......