当前位置: 首页 > news >正文

go语言中的字符串详解

目录

字符串的基本特点

1.字符串的不可变性

2.其他基本特点

字符串基本操作

1. 创建字符串

2. 获取字符串长度

3. 字符串拼接

4. 遍历字符串

5. 字符串比较

字符串常用函数

1. 判断子串

2. 查找与索引

3. 字符串替换

4. 分割与连接

5. 修剪字符串

6. 大小写转换

字符串与其他类型转换

1. 字符串转数字

2. 字符串转字节切片

3. 字节切片转字符串

4. 字符串转 Rune 切片

性能优化建议


Go 语言中,字符串是不可变的 UTF-8 编码字节序列。它提供了多种字符串操作方法和包支持,以下是 Go 中字符串操作的详细讲解。


字符串的基本特点

1.字符串的不可变性

在 Go 中,字符串一旦被创建,其内容是无法被直接修改的。这一特性源于字符串在 Go 中被设计为只读的 UTF-8 字节序列。不可变字符串避免了多线程环境下的竞态条件,字符串可以安全地在不同 Goroutines 中传递而不需要额外的同步操作。字符串不可变意味着可以缓存其哈希值或其他元数据,从而在需要多次比较时提高效率(如在 map 中用作键)。

  • 无法直接修改字符串内容 你可以通过索引访问字符串中的某个字节,但无法通过索引赋值来修改字符串内容。

    s := "hello"
    fmt.Println(s[0]) // 输出 104,对应 'h'// s[0] = 'H' // 编译错误:cannot assign to s[0]
    
  • 修改字符串会创建新的字符串 如果需要更改字符串的内容,实际上是通过创建一个新的字符串来实现的,而不是在原字符串上进行修改。

    s := "hello"
    newS := "H" + s[1:] // 创建新字符串
    fmt.Println(newS)   // 输出 "Hello"
    
  • 性能的隐性影响

    • 因为字符串不可变,每次修改字符串时都会分配新的内存来存储新字符串,频繁的字符串操作可能会导致性能问题。
    • 解决方法:对于频繁的拼接或修改操作,可以使用可变的 strings.Builder[]byte
2.其他基本特点
  1. 索引访问:可以通过索引访问字节(s[i]),但无法直接修改。
  2. 支持 Unicode:字符串是 UTF-8 编码,可以包含中文、日文等多字节字符。
  3. 零值:字符串的零值是空字符串 ""

字符串基本操作

1. 创建字符串
s1 := "Hello, World!" // 直接赋值
s2 := `这是一个
多行字符串`        // 原生字符串(支持多行,内容不转义)
2. 获取字符串长度

len() 返回字符串的字节数(注意是字节数,不是字符数)。

s := "你好"
fmt.Println(len(s)) // 输出 6,因为 "你" 和 "好" 各占 3 个字节
3. 字符串拼接

使用 +fmt.Sprintf 拼接字符串。

s1 := "Hello"
s2 := "World"
s := s1 + ", " + s2
fmt.Println(s) // 输出 "Hello, World"s3 := fmt.Sprintf("%s, %s!", s1, s2)
fmt.Println(s3) // 输出 "Hello, World!"
4. 遍历字符串
s := "你好Go"
for i := 0; i < len(s); i++ {fmt.Printf("Byte %d: %x\n", i, s[i]) // 按字节遍历
}for i, r := range s {fmt.Printf("Index %d: Rune %c\n", i, r) // 按字符遍历
}
5. 字符串比较
s1 := "abc"
s2 := "def"
fmt.Println(s1 == s2) // false
fmt.Println(s1 < s2)  // true,按字典序比较

字符串常用函数

Go 提供了内置的 strings 包来操作字符串。

1. 判断子串
  • strings.Contains:是否包含子串。
  • strings.HasPrefix:是否以子串开头。
  • strings.HasSuffix:是否以子串结尾。
import "strings"s := "hello, world"
fmt.Println(strings.Contains(s, "world"))   // true
fmt.Println(strings.HasPrefix(s, "hello")) // true
fmt.Println(strings.HasSuffix(s, "d"))     // true
2. 查找与索引
  • strings.Index:返回子串首次出现的索引,未找到返回 -1。
  • strings.LastIndex:返回子串最后出现的索引。
  • strings.Count:统计子串出现的次数。
s := "go is a good language"
fmt.Println(strings.Index(s, "good"))   // 8
fmt.Println(strings.LastIndex(s, "g")) // 17
fmt.Println(strings.Count(s, "g"))     // 3
3. 字符串替换
  • strings.Replace:替换指定子串。
  • strings.ReplaceAll:替换所有子串。
s := "hello, hello, world"
s1 := strings.Replace(s, "hello", "hi", 1)  // 替换 1 次
s2 := strings.ReplaceAll(s, "hello", "hi") // 替换所有
fmt.Println(s1) // "hi, hello, world"
fmt.Println(s2) // "hi, hi, world"
4. 分割与连接
  • strings.Split:根据分隔符分割。
  • strings.Join:将字符串切片连接。
s := "a,b,c"
parts := strings.Split(s, ",")
fmt.Println(parts) // [a b c]joined := strings.Join(parts, "-")
fmt.Println(joined) // "a-b-c"
5. 修剪字符串
  • strings.Trim:移除指定字符。
  • strings.TrimSpace:移除两端空格。
  • strings.TrimPrefixstrings.TrimSuffix:移除前缀或后缀。
s := "  hello  "
fmt.Println(strings.TrimSpace(s))        // "hello"
fmt.Println(strings.Trim(s, " h"))       // "ello"
fmt.Println(strings.TrimPrefix(s, "  ")) // "hello  "
fmt.Println(strings.TrimSuffix(s, "  ")) // "  hello"
6. 大小写转换
  • strings.ToUpper:转大写。
  • strings.ToLower:转小写。
s := "GoLang"
fmt.Println(strings.ToUpper(s)) // "GOLANG"
fmt.Println(strings.ToLower(s)) // "golang"

字符串与其他类型转换

1. 字符串转数字

使用 strconv 包。

import "strconv"n, err := strconv.Atoi("123")
if err != nil {fmt.Println("转换错误")
}
fmt.Println(n) // 123s := strconv.Itoa(456)
fmt.Println(s) // "456"
2. 字符串转字节切片
s := "hello"
b := []byte(s)
fmt.Println(b) // [104 101 108 108 111]
3. 字节切片转字符串
b := []byte{104, 101, 108, 108, 111}
s := string(b)
fmt.Println(s) // "hello"
4. 字符串转 Rune 切片
s := "你好"
r := []rune(s)
fmt.Println(r)        // [20320 22909]
fmt.Println(string(r)) // "你好"

性能优化建议

  1. 拼接大量字符串时:使用 strings.Builderbytes.Buffer,效率高于 + 拼接。
import "strings"var builder strings.Builder
builder.WriteString("hello")
builder.WriteString(", ")
builder.WriteString("world")
fmt.Println(builder.String()) // "hello, world"
  1. 避免重复操作:对字符串多次操作时,优先考虑转换为字节切片或 rune 切片操作。

相关文章:

go语言中的字符串详解

目录 字符串的基本特点 1.字符串的不可变性 2.其他基本特点 字符串基本操作 1. 创建字符串 2. 获取字符串长度 3. 字符串拼接 4. 遍历字符串 5. 字符串比较 字符串常用函数 1. 判断子串 2. 查找与索引 3. 字符串替换 4. 分割与连接 5. 修剪字符串 6. 大小写转换…...

Windows脚本清理C盘缓存

方法一&#xff1a;使用power文件.ps1的文件 脚本功能 清理临时文件夹&#xff1a; 当前用户的临时文件夹&#xff08;%Temp%&#xff09;。系统临时文件夹&#xff08;C:\Windows\Temp&#xff09;。 清理 Windows 更新缓存&#xff1a; 删除 Windows 更新下载缓存&#xff0…...

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC&#xff08;Two-Phase Commit&#xff09;协议准备阶段提交阶段情况 1&#xff1a;只要有一个事务参与者反馈未就绪&#xff08;no ready&#xff09;&#xff0c;事务协调者就会回滚事务情况 2&#xff1a;当所有事务参与者均反馈就绪&#xff08;ready&a…...

永磁同步电机负载估计算法--自适应扩张状态观测器

一、 原理介绍 在线性扩张观测器中&#xff0c;LESO观测器增益ω0 决定了观测器的跟踪速度&#xff0c;ω0 越大&#xff0c;观测器估计精度越高&#xff0c; 抗干扰能力越强&#xff0c;瞬态响应速度加快&#xff0c;过大则会引入高频噪声使系统不稳定。为使观测器在全速域内…...

【HarmonyOS应用开发——ArkTS语言】购物商城的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 1. 在src/main/ets文件中创建components文件夹并在其中创建Home.ets和HomeProduct.ets文件。​ 2. 在Home.ets文件中定义 Home 组…...

Python二维码生成器qrcode库

要在Python中生成二维码&#xff0c;你可以使用 qrcode 库。这个库非常方便&#xff0c;允许你生成并保存二维码图像。下面是一个简单的示例&#xff0c;展示了如何使用 qrcode 库生成二维码。 首先&#xff0c;你需要安装 qrcode 库。你可以使用 pip 来安装它&#xff1a; s…...

Python:模拟(包含例题:饮料换购 图像模糊 螺旋矩阵)

模拟题&#xff1a;直接按照题目含义模拟即可&#xff0c;一般不涉及算法 注意&#xff1a; 1.读懂题&#xff1a;理清楚题目流程 2.代码和步骤一一对应&#xff1a;变量名&#xff0c;函数名&#xff0c;函数功能 3.提取重复的部分&#xff0c;写成对应的函数&#xff08;…...

git分支与部署环境的关系以及开发规范

一 某金融机构 1.1 分支分类以及作用 1.master master分支为主分支,用于部署生产环境的分支,无论任何时候都要确保master分支的稳定性;master分支由feature及hotfix分支合并,任何时间都不能直接修改代码。目前用于老仿真和老生产,暂时不动。 2.prod 主分支,是master…...

2024最新鸿蒙开发面试题合集(一)-HarmonyOS NEXT Release(API 12 Release)

1. HarmonyOS应用打包后的文件扩展名是? 打包后的文件扩展名为.hap&#xff08;HarmonyOS Ability Package&#xff09;&#xff0c;这是HarmonyOS应用的标准包格式 2. 页面和自定义组件生命周期有哪些? 页面和自定义组件生命周期说明 有Entry装饰器的component组件的生命…...

【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响

# 和 $ 的区别 在MyBatis中&#xff0c;# 和 $ 是用来处理参数的两种不同方式&#xff0c;它们之间有一些重要的区别&#xff1a; # 符号&#xff1a; # 是用来进行参数占位符的&#xff0c;它会进行 SQL 注入防护。使用 # 时&#xff0c;MyBatis 会将参数值进行预处理&…...

Java面试题,数据结构,图的最短路径算法应用于社交网络分析

图的最短路径算法应用于社交网络分析 在一个大型社交网络中&#xff0c;用户想要找到连接两个特定用户的最短路径。假设你已经有了这个社交网络的数据模型&#xff0c;其中节点代表用户&#xff0c;边代表用户之间的关系。请设计一个解决方案&#xff0c;以找出两个用户之间的…...

Tree数据处理

文章目录 一、Tree数据重置二、Tree拆分成二级数据1、过滤数据2、二级数据 Tree组件的数据处理往往需要使用递归&#xff0c;本文归纳一下常见的数据处理情景&#xff0c;持续更新&#xff1b; 一、Tree数据重置 递归的标志就是寻找子元素的集合字段&#xff0c;一般为children…...

idea配置gitee仓库

idea配置gitee 0、fork开源项目 到自己的仓库&#xff0c;这一步相当于创建了一个自己的git仓库&#xff0c;并复制了别人的开源代码。 注意&#xff1a;如果直接下载别人的开源项目&#xff0c;需要从新配置git仓库信息&#xff0c;因为开源项目一般都设置了git信息。而修改…...

SpringBoot 事务

事务是一组操作的集合, 是一个不可分割的操作.会把所有的操作作为一个整体, 一起向数据库提交或者是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败. 为什么需要事务? 我们在进行程序开发时, 也会有事务的需求. 比如转账操作: 第一步&#xff1a;A 账户 -100 元. …...

我的JAVA-Web基础(1)

1.HTML 2.css CSS&#xff08;层叠样式表&#xff09;提供了多种选择器来定位HTML文档中的元素&#xff0c;以便可以应用样式。以下是三种常用的选择器简述&#xff1a; ID 选择器&#xff1a; ID选择器使用HTML元素的id属性来定位单个元素。每个页面中id应该是唯一的&#xf…...

【Leetcode 热题 100】207. 课程表

问题背景 你这个学期必须选修 n u m C o u r s e s numCourses numCourses 门课程&#xff0c;记为 0 0 0 到 n u m C o u r s e s − 1 numCourses - 1 numCourses−1。 在选修某些课程之前需要一些先修课程。 先修课程按数组 p r e r e q u i s i t e s prerequisites p…...

从CreateDialogIndirectParam起---我与大模型对话

前言&#xff1a; 对当前的大模型来说&#xff0c;一切皆程序&#xff0c;皆标准。只能按照推定的线路行走&#xff0c;就像机器人走进死胡同&#xff0c;不停的踏步也不回头。除非人为去干预它。其实我提出的这个问题前是因为我不清楚了解一部分WinAPI有着严格的检查机制和自毁…...

重温设计模式--建造者模式

文章目录 建造者模式&#xff08;Builder Pattern&#xff09;概述建造者模式UML图作用&#xff1a;建造者模式的结构产品&#xff08;Product&#xff09;&#xff1a;抽象建造者&#xff08;Builder&#xff09;&#xff1a;具体建造者&#xff08;Concrete Builder&#xff…...

CSS(五):定位

目录 相对定位 绝对定位 固定定位 在 CSS 中&#xff0c;position 属性用于控制元素的定位方式&#xff0c;使我们可以精确地控制元素在页面上的位置。定位分为相对定位、绝对定位、和固定定位 相对定位 相对定位&#xff1a;position: relative; 相对定位意味着元素的位置…...

JSON 系列之2:JSON简单查询

本文为Oracle数据库JSON学习系列的第2篇&#xff0c;讲述如何对存储在数据库中的JSON文档进行简单的查询。 创建测试表&#xff0c;插入2条数据&#xff1a; DROP TABLE colortab PURGE;CREATE TABLE colortab (id NUMBER,color VARCHAR2(4000),CONSTRAINT ensure_json CH…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...