【Golang】Golang进阶系列教程--为什么说 Go 语言字符串是不可变的?

文章目录

  • 前言
  • 推荐阅读

前言

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

这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。

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

type stringStruct struct {str unsafe.Pointerlen 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 语言教程–介绍(一)
  • 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 并发(二十一)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/15800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一个jquery重复绑定事件的问题

这篇文章主要分享一下前端在使用jQuery给元素绑定click事件时遇到的一点小问题。 今天在通过JS代码动态绑定元素的点击事件时遇到一点问题,如上图所示,需要实现动态控制低级内丹格子的解锁,每种宠物造型都有一个内丹数量。如图,忘…

docker如何运行容器?

文章目录 1 容器操作1.1容器相关命令1.2 创建并运行一个容器docker命令解析nacos启动成功 访问进入容器,修改配置文件 总结 接上集 CentOS 7安装Docker https://blog.csdn.net/qq_39017153/article/details/131955100 1 容器操作 1.1容器相关命令 容器操作的命令如…

【LeetCode 算法】Linked List Cycle II 环形链表 II

文章目录 Linked List Cycle II 环形链表 II问题描述:分析代码哈希快慢指针 Tag Linked List Cycle II 环形链表 II 问题描述: 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链…

FPGA实现NIC 10G UDP协议栈网卡,纯verilog代码编写,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、10G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHY流水线队列管理发送调度程序端口和接口数据路径以及发送和接收引擎分段内存接口 5、vivado工程详解6、上板…

Vue教程(三):计算属性

1、姓名案例—插值语法版 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>姓名案例-插值语法版</title><script type"text/javascript" src"../js/vue.js"><…

【Docker】制作Docker私有仓库

文章目录 1. 安装私有镜像仓库2. 镜像仓库可视化3. 参考资料 1. 安装私有镜像仓库 由于之后我们需要推送到私有镜像仓库&#xff0c;我们预先安装好&#xff0c;使用的是Docker公司开发的私有镜像仓库Registry。 下载Registry的Docker镜像&#xff1b; docker pull registry:2使…

极验4代滑块验证码破解(补环境直接强暴式拿下)

目录 前言一、分析二、验证总结借鉴 前言 极验第四代好像简单了特别多&#xff0c;没有什么技巧&#xff0c;环境党直接5分钟拿下。 网址: aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vYWRhcHRpdmUtY2FwdGNoYS1kZW1v 一、分析 直接去它官网&#xff0c;滑动滑块打开控制台瞅瞅 可以看…

Spring Boot 3.x 系列【49】启动流程 | 创建、准备应用上下文

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 1. 前言2. 核心类2.1 ServletWebServerApplicationContext2.2 AnnotatedBeanDefinitionReader ClassPathBeanDefinitionSc…

CSS中有哪些单位?

CSS中有多种单位可用于指定尺寸、长度、角度等值。 下面是一些常见的CSS单位&#xff1a; 1. px (pixels)&#xff1a;像素单位&#xff0c;是相对于屏幕上的单个像素点的长度单位。 2. % (percentage)&#xff1a;百分比单位&#xff0c;相对于父元素的特定属性的值进行计算…

day18-二叉树统一迭代写法

二叉树统一迭代写法 思路 前面说了&#xff0c;前序/后序和中序不能统一的原因是因为&#xff0c;访问和处理的时机不同&#xff0c;如果要做到同时处理&#xff0c;我们可以在要处理的结点后放一个空指针作为标记。如下 前序代码&#xff1a; class Solution { public:vec…

【Leetcode】69.x的平方根

一、题目 1、题目描述 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例1: 输入:x = 4 输出:2示例2: 输入:…

Maven pom.xml文件中build,plugin标签的具体使用

<build> 标签 <build> 标签是 pom.xml 文件中一个重要的标签&#xff0c;用于配置 Maven 项目的构建过程。在 <build> 标签下&#xff0c;可以配置构建相关的设置&#xff0c;包括源代码目录、输出目录、插件配置等。 以下是 <build> 标签的详细使用方…

数学建模学习(8):单目标和多目标规划

优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…

MyBatis缓存-提高检索效率的利器--二级缓存

文章目录 缓存-提高检索效率的利器缓存-官方文档二级缓存基本介绍二级缓存原理图 二级缓存快速入门快速入门注意事项和使用陷阱理解二级缓存策略的参数 四大策略如何禁用二级缓存mybatis 刷新二级缓存的设置 缓存-提高检索效率的利器 缓存-官方文档 文档地址: https://mybati…

秋叶整合包如何安装Python包

前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章&#xff0c;有同学运行时遇到缺少Python Module的问题&#xff0c;帮助他处理了一下&#xff0c;今天把这个经验分享给大家&#xff0c;希望能帮助到更多的同学。 有时候启动某些插件的时候会出现 Mo…

【单机多卡】torch改造代码为DDP单机多卡分布式并行

torch分布式数据并行DDPtorch.nn.parallel.DistributedDataParallel代码修改记录。&#xff08;要求pytorch_version>1.0&#xff09; 目录 1.&#x1f344;&#x1f344;要修改的地方概览 2.✏️✏️初始化 3.✏️✏️设置当前进程GPU 4.✏️✏️设置sampler 5.✏️✏…

【设计模式】简单工厂模式

C语言实现简单的工厂模式 #include <stdio.h> #include <stdlib.h>// 图形类型枚举 typedef enum {CIRCLE,SQUARE,RECTANGLE } ShapeType;// 图形结构体 typedef struct {ShapeType type;float area; } Shape;// 创建圆形 Shape* createCircle() {Shape* circle …

大数据开发面试必问:Hive调优技巧系列一

Hive必问调优 Hive 调优拆解:Hive SQL 几乎是每一位互联网分析师的必备技能&#xff0c;相信很多小伙伴都有被面试官问到 Hive 优化问题的经历。所以掌握扎实的 HQL 基础尤为重要&#xff0c;hive优化也是小伙伴应该掌握的一项技能&#xff0c;本篇文章具体从hive建表优化、HQ…

数据结构-链表结构-单向链表

链表结构 说到链表结构就不得不提起数据结构&#xff0c;什么是数据结构&#xff1f;就是用来组织和存储数据的某种结构。那么到底是某种结构呢&#xff1f; 数据结构分为&#xff1a; 线性结构 数组&#xff0c;链表&#xff0c;栈&#xff0c;队列 树形结构 二叉树&#x…

QWidget窗口类

QWidget窗口类 设置父对象窗口位置窗口尺寸窗口标题和图标信号槽函数例子1例子3例子3 设置父对象 // 构造函数 QWidget::QWidget(QWidget *parent nullptr, Qt::WindowFlags f Qt::WindowFlags());// 公共成员函数 // 给当前窗口设置父对象 void QWidget::setParent(QWidget…