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

Go:strings包的基本使用

文章目录

  • string
    • 前缀和后缀
    • 字符串包含
    • 判断子字符串或字符在父字符串中出现的位置
    • 字符串替换
    • 统计字符串出现次数
    • 重复字符串
    • 修改字符串大小写
    • 修剪字符串
    • 分割字符串
    • 拼接 slice 到字符串
  • strconv

本篇主要总结的是go中的string包的一些函数的操作讲解

string

在各个语言中,都有对应的处理字符串的包,在go中是使用strings来处理的

前缀和后缀

HasPrefix() 判断字符串 s 是否以 prefix 开头:

strings.HasPrefix(s, prefix string) bool

HasSuffix() 判断字符串 s 是否以 suffix 结尾:

strings.HasSuffix(s, suffix string) bool

示例代码

func test1() {fmt.Println(strings.HasPrefix("this is string", "this"))fmt.Println(strings.HasPrefix("this is string", "1this"))fmt.Println(strings.HasSuffix("this is string", "ing"))fmt.Println(strings.HasSuffix("this is string", "iing"))
}

字符串包含

Contains() 判断字符串 s 是否包含 substr:

strings.Contains(s, substr string) bool

示例代码

func test2() {totalString := "hello go, i love cpp"containString1 := "go"containString2 := "cpp"containString3 := "java"fmt.Printf("\"%s\" contain in \"%s\"? the ans is %t\n", containString1, totalString, strings.Contains(totalString, containString1))fmt.Printf("\"%s\" contain in \"%s\"? the ans is %t\n", containString2, totalString, strings.Contains(totalString, containString2))fmt.Printf("\"%s\" contain in \"%s\"? the ans is %t\n", containString3, totalString, strings.Contains(totalString, containString3))
}

这里顺便温习一下对于Go中转义字符的使用

判断子字符串或字符在父字符串中出现的位置

Index() 返回字符串 str 在字符串 s 中的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str:

strings.Index(s, str string) int

LastIndex() 返回字符串 str 在字符串 s 中最后出现位置的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str:

strings.LastIndex(s, str string) int

示例代码:

func test3() {totalString := "hello go, i love cpp, i love cpp and go"containString1 := "go"containString2 := "cpp"containString3 := "java"fmt.Println("first index demo is:")fmt.Printf("\"%s\" first index in \"%s\" is %d\n", containString1, totalString, strings.Index(totalString, containString1))fmt.Printf("\"%s\" first index in \"%s\" is %d\n", containString2, totalString, strings.Index(totalString, containString2))fmt.Printf("\"%s\" first index in \"%s\" is %d\n", containString3, totalString, strings.Index(totalString, containString3))fmt.Println("last index demo is:")fmt.Printf("\"%s\" first index in \"%s\" is %d\n", containString1, totalString, strings.LastIndex(totalString, containString1))fmt.Printf("\"%s\" first index in \"%s\" is %d\n", containString2, totalString, strings.LastIndex(totalString, containString2))fmt.Printf("\"%s\" first index in \"%s\" is %d\n", containString3, totalString, strings.LastIndex(totalString, containString3))
}

运行结果为:

first index demo is:
"go" first index in "hello go, i love cpp, i love cpp and go" is 6
"cpp" first index in "hello go, i love cpp, i love cpp and go" is 17
"java" first index in "hello go, i love cpp, i love cpp and go" is -1
last index demo is:
"go" first index in "hello go, i love cpp, i love cpp and go" is 37
"cpp" first index in "hello go, i love cpp, i love cpp and go" is 29
"java" first index in "hello go, i love cpp, i love cpp and go" is -1

如果需要查询非 ASCII 编码的字符在父字符串中的位置,建议使用以下函数来对字符进行定位:

strings.IndexRune(s string, r rune) int

字符串替换

Replace() 用于将字符串 str 中的前 n 个字符串 old 替换为字符串 new,并返回一个新的字符串,如果 n = -1 则替换所有字符串 old 为字符串 new:

strings.Replace(str, old, new string, n int) string

示例代码

func test4() {str1 := "hello hello hello hello hello hello"str2 := strings.Replace(str1, "hello", "no", -1)fmt.Println(str2)
}

这个函数的意思就是只要识别到有可以替换的字符串,并且对于最后一个数字嗯,并没有超过所限制的数量,那么就会将这个识别道德字符串替换为想要替换成的字符串,比如在这个例子当中当识别到字符串中含有哈喽,这个单词是就会将hello替换成no,前提是没有超过-1的限制,而因为-1的意思是,只要有字符串就进行替换,那么就会整个将这个字符串当中所有含有hello的字符串都替换为no

统计字符串出现次数

Count() 用于计算字符串 str 在字符串 s 中出现的非重叠次数:

strings.Count(s, str string) int

示例代码

func test5() {str1 := "hello world hello world hellhello world"fmt.Println(strings.Count(str1, "hello"))fmt.Println(strings.Count(str1, "world"))
}

重复字符串

Repeat() 用于重复 count 次字符串 s 并返回一个新的字符串:

strings.Repeat(s, count int) string

示例代码

func test6() {str := "hello go"fmt.Println(strings.Repeat(str, 10))fmt.Println(strings.Repeat(str, 2))
}

修改字符串大小写

ToLower() 将字符串中的 Unicode 字符全部转换为相应的小写字符:

strings.ToLower(s) string

ToUpper() 将字符串中的 Unicode 字符全部转换为相应的大写字符:

strings.ToUpper(s) string

示例代码

func test7() {str := "hello World This is TEST"fmt.Println(strings.ToLower(str))fmt.Println(strings.ToUpper(str))
}

修剪字符串

你可以使用 strings.TrimSpace(s) 来剔除字符串开头和结尾的空白符号;如果你想要剔除指定字符,则可以使用 strings.Trim(s, “cut”) 来将开头和结尾的 cut 去除掉。该函数的第二个参数可以包含任何字符,如果你只想剔除开头或者结尾的字符串,则可以使用 TrimLeft() 或者 TrimRight() 来实现。

示例代码

func test8() {str1 := "11hello world111"str2 := "  hello go    "fmt.Println("去除空白")fmt.Println(strings.TrimSpace(str1))fmt.Println(strings.TrimSpace(str2))fmt.Println("去除左侧空白")fmt.Println(strings.TrimLeft(str2, " "))fmt.Println("去除左侧字符1")fmt.Println(strings.TrimLeft(str1, "1"))fmt.Println("去除右侧字符1")fmt.Println(strings.TrimRight(str1, "1"))fmt.Println("去除左右两侧1")fmt.Println(strings.Trim(str1, "1"))
}

分割字符串

strings.Fields(s) 将会利用 1 个或多个空白符号来作为动态长度的分隔符将字符串分割成若干小块,并返回一个 slice,如果字符串只包含空白符号,则返回一个长度为 0 的 slice。

strings.Split(s, sep) 用于自定义分割符号来对指定字符串进行分割,同样返回 slice。

因为这 2 个函数都会返回 slice,所以习惯使用 for-range 循环来对其进行处理

示例代码

func test9() {str1 := "hello1 hello2 hello3      hello4"fmt.Println("以一个空格为分隔符")s1 := strings.Split(str1, " ")for _, t := range s1 {fmt.Println(t)}fmt.Println("以一个或多个空格为分隔符")s2 := strings.Fields(str1)for _, t := range s2 {fmt.Println(t)}str3 := "hello11hello22hello321321312hello4"fmt.Println("以hello为分隔符")s3 := strings.Split(str3, "hello")for _, t := range s3 {fmt.Println(t)}
}

拼接 slice 到字符串

Join() 用于将元素类型为 string 的 slice 使用分割符号来拼接组成一个字符串:

strings.Join(sl []string, sep string) string

示例代码

func test10() {// 定义一个字符串切片sl := []string{"apple", "banana", "cherry"}// 使用空格作为分隔符拼接切片中的字符串result := strings.Join(sl, " ")fmt.Println(result) // 输出 "apple banana cherry"// 使用逗号和空格作为分隔符拼接切片中的字符串result2 := strings.Join(sl, ", ")fmt.Println(result2) // 输出 "apple, banana, cherry"
}

strconv

string类型的数据和其他类型的数据进行转换,实际上是借助这个包来完成的

这里只讲述最基本的内容,其他的内容之后再进行讲解

示例代码:

func test11() {str1 := "666"number, _ := strconv.Atoi(str1)fmt.Println(number)fmt.Println(strconv.Itoa(number + 5))
}

相关文章:

Go:strings包的基本使用

文章目录 string前缀和后缀字符串包含判断子字符串或字符在父字符串中出现的位置字符串替换统计字符串出现次数重复字符串修改字符串大小写修剪字符串分割字符串拼接 slice 到字符串 strconv 本篇主要总结的是go中的string包的一些函数的操作讲解 string 在各个语言中&#x…...

uniapp,获取头部高度

头部自定义时候&#xff0c;设置获取安全区域&#xff0c;可以用 uni.getSystemInfoSync();接口。 <view class"statusBar" :style"{height:statusBarHeightpx}"> let SYSuni.getSystemInfoSync(); let statusBarHeightref(SYS.statusBarHeight) …...

开发面试题-更新中...

探迹科技&#xff08;腾讯面试官&#xff09; 1.了不了解循环屏障 2.对于java中的线程冲突有多少了解&#xff08;我要算1加到1亿&#xff09; 3.mysql调优怎么调&#xff08;我跟他讲了explain&#xff09; 4.type中ref&#xff0c;range,const的区别 5.我有1亿的数据量&…...

【Jmeter】jmeter指定jdk版本启动

背景&#xff1a; 因权限问题&#xff0c;不能修改操作系统的环境变量或者因jmeter启动加载的默认jdk8版本低&#xff0c;需要指定jdk XX版本启动Jmeter 解决办法&#xff1a; 进入jmeter bin目录选择jmeter.bat&#xff0c;记事本编辑jmeter.bat, 在最前面添加 set MINIMAL_…...

数据处理利器:图片识别转Excel表格让数据录入变简单

在现代职场中&#xff0c;手动录入数据是一个耗时且容易出错的过程。无论是纸质文件、照片还是截图&#xff0c;繁琐的输入常常让人感到头疼。如何高效地将这些信息转化为电子表格&#xff0c;是许多职场人士面临的挑战。 为了解决这一问题&#xff0c;我们推出了图片识别转Exc…...

【WPF】中Binding的应用

在 WPF (Windows Presentation Foundation) 中&#xff0c;数据绑定是一种强大的机制&#xff0c;它允许你将用户界面&#xff08;UI&#xff09;元素的属性与各种数据源关联起来。这种关联可以是单向的、双向的或一次性的。WPF 的数据绑定支持多种数据源&#xff0c;包括普通对…...

华为OD机试2024年真题(基站维修工程师)

基站维修工程师&#xff08;200分&#xff09; 小王是一名基站维护工程师&#xff0c;负责某区域的基站维护。 某地方有n个基站(1<n<10)&#xff0c;已知各基站之间的距离s(0<s<500)&#xff0c;并且基站x到基站y的距离&#xff0c;与基站y到基站x的距离并不一定会…...

在MySQL中为啥引入批量键访问(Batch Key Access, BKA)

批量键访问&#xff08;Batch Key Access, BKA&#xff09; 是 MySQL 在某些情况下用于优化 JOIN 操作的一种技术&#xff0c;特别是在通过索引进行 JOIN 时&#xff0c;它能有效减少查询的随机 I/O。批量键访问优化通过将一批主键或索引键一次性发送给存储引擎来查找匹配的行&…...

912.排序数组(归并排序)

目录 题目解法初始数组1. 分解阶段2. 合并阶段结果 为什么要创建长整型ll mid l ((r - l) >> 1);其中的>>是什么意思 题目 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O…...

使用 cmake 在 x86 系统中为 arm 系统交叉编译程序

原理&#xff1a; 在 x86 系统里使用交叉编译工具链&#xff08;arm 版 gcc/g&#xff09;编译程序&#xff0c;然后放在 arm 系统里运行。 arm 版本 使用 lscpu 查看 cpu 架构 版本说明armv732 bitarmv8/arrch6464 bit 安装交叉编译工具链 # 针对 armv7 sudo apt install…...

软考(网工)——网络规划设计

文章目录 &#x1f550;综合布线1️⃣结构化布线系统2️⃣综合布线六大子系统3️⃣综合布线物理结构图 &#x1f551;网络分析与设计1️⃣网络规划设计模型2️⃣网络流量分析3️⃣网络安全技术措施表4️⃣技术评价 &#x1f552;网络结构与功能1️⃣局域网结构类型2️⃣三层架构…...

即插即用特征融合模块,即用即涨点!

特征融合&#xff08;Feature Fusion&#xff09;是深度学习中的一种重要技术&#xff0c;它可以帮助模型更好地理解数据的内在结构和规律&#xff0c;提高模型的性能和泛化能力。 另外&#xff0c;特征融合还可以提高模型的分类准确率&#xff0c;减少过拟合风险&#xff0c;…...

蓝桥算法双周赛 第 19 场 小白入门赛

打开石门 只要有相连的一样字母就可以消成一个 string s; int ans;void solve() {cin >> s;int len 0;for (int i 0;i < s.size();i ){if (s[i] L) len ;else //遇到Q{ans (len ? 1 : 0); //消除累计的Llen 0;ans ;//遇到Q}}//QLLLL时,最后遇不到Q让累计的L消…...

Cursor零基础小白教程系列「进阶」 - Cursor 智能代码补全详解(Tab)

最适合小白零基础的Cursor教程 网站lookai.top相同作者&#xff0c;最新文章会在网站更新&#xff0c;欢迎收藏书签 Cursor 智能代码补全详解(Tab) 概述 Cursor的智能代码补全&#xff0c;也就是快捷键Tab&#xff0c;是其最强大和独特的AI辅助编程工具之一。本教程将详细介绍…...

数据结构《顺序表》

文章目录 前言一、什么是顺序表&#xff1f;1.1 顺序表的概念1.2 顺序表的建立 二、MyArrayList的实现三、顺序表的方法四、关于顺序表的例子总结 前言 提示&#xff1a;这里涉及到的ArrayList类是一个泛型类&#xff0c;同时后面的很多内容都会涉及到泛型&#xff0c;如果不了…...

视频分享网站毕业设计基于SpringBootSSM框架

目录 1.摘要 2.引言 2.1 研究意义 3 功能描述 3.1‌功能图展示 ‌3.2非功能需求‌ 4. 需求分析 4.1前端技术 4.2后端技术 4.3视频处理技术 4.4内容分发网络&#xff08;CDN&#xff09; 4.5其他关键技术 计算机毕业设计/springboot/javaWEB/J2EE/MYSQL数据库/vue前后…...

Python多进程学习与使用:全面指南

Python多进程学习与使用&#xff1a;全面指南 目录 引言什么是多进程&#xff1f;为什么使用多进程&#xff1f;Python中的多进程模块&#xff1a;multiprocessing创建进程的基本方法进程间通信进程池多进程与多线程的比较常见问题和解决方案最佳实践和性能优化实战项目&…...

HTTP Proxy环境下部署Microsoft Entra Connect和Health Agents

在企业环境中&#xff0c;时常需要通过使用HTTP Proxy访问Internet&#xff0c;在使用HTTP Proxy访问Internet的环境中部署Microsoft Entra Connect和Microsoft Entra Connect Health Agents可能会遇到一些额外的配置步骤&#xff0c;以便这些服务能够正常连接到Internet。 一…...

基于单片机的 OLED 显示终端设计分析与研究

摘要: 我国的经济发展速度正在不断加快,经济体制也在经历着一系列的改革,工业发展也正是受到了它的影响,逐步发生变化。在这样的背景下,传统的 LCD 显示技术,逐渐被显示效果更好,功耗更低的 OLED 代替。本文主要介绍了基于单片机的 OLED 显示终端设计,该设计目前具有很…...

基于Multisim压力报警器电路设计(含仿真和报告)

【全套资料.zip】压力报警器电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 压力报警器包括:压力检测、信号放大、声光报警当电路检测到系统压力正常时&#xff0c;不进行声、光报…...

Python 装饰器实战:用@syntax 优雅地增强函数功能

# Python 装饰器实战&#xff1a;用syntax 优雅地增强函数功能## 什么是装饰器&#xff1f;装饰器&#xff08;Decorator&#xff09;是 Python 中的一种高级特性&#xff0c;它允许你在不修改原函数代码的情况下&#xff0c;动态地给函数添加功能。简单来说&#xff0c;装饰器…...

Verilog实战精要:从语法基础到高效状态机设计

1. Verilog语法基础&#xff1a;从硬件思维出发 第一次接触Verilog时&#xff0c;很多人会把它当成普通编程语言来学&#xff0c;结果发现处处碰壁。我当年在FPGA项目上栽的第一个跟头&#xff0c;就是把阻塞赋值用在了时钟触发的always块里&#xff0c;导致仿真结果和实际硬件…...

Qwen3.5-4B-Claude-Opus实战案例:用推理链输出提升技术沟通准确性

Qwen3.5-4B-Claude-Opus实战案例&#xff1a;用推理链输出提升技术沟通准确性 1. 模型介绍与核心能力 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个基于Qwen3.5-4B的推理蒸馏模型&#xff0c;专门针对结构化分析、分步骤回答以及代码与逻辑类问题的处理能力进…...

AsyncSerial:嵌入式非阻塞串口通信实现

1. AsyncSerial 库深度解析&#xff1a;面向嵌入式实时系统的非阻塞串口通信实现 在嵌入式系统开发中&#xff0c;串口&#xff08;UART/USART&#xff09;通信因其硬件资源占用少、协议简单、调试便捷等优势&#xff0c;始终是固件层最基础且高频使用的外设接口。然而&#xf…...

Wan2.2-I2V-A14B企业落地:汽车4S店车型介绍短视频自动化生产系统

Wan2.2-I2V-A14B企业落地&#xff1a;汽车4S店车型介绍短视频自动化生产系统 1. 项目背景与需求分析 汽车4S店每天需要为不同车型制作大量介绍视频&#xff0c;传统视频制作方式面临三大痛点&#xff1a; 人力成本高&#xff1a;专业视频团队制作单条视频成本约2000-5000元制…...

手把手教你搞定CMT2300A的315MHz匹配电路:从原理图到物料清单(附实测数据)

深入解析CMT2300A在315MHz频段的射频匹配电路设计与实战优化 作为一名长期深耕射频硬件设计的工程师&#xff0c;我最近在工业遥控器项目中遇到了一个典型挑战&#xff1a;如何为CMT2300A设计稳定可靠的315MHz匹配电路。与常见的433MHz应用不同&#xff0c;315MHz频段在元件参数…...

为什么你的STM32F103工程编译失败?可能是启动文件没选对!

为什么你的STM32F103工程编译失败&#xff1f;可能是启动文件没选对&#xff01; 在嵌入式开发领域&#xff0c;STM32系列微控制器因其出色的性能和丰富的外设资源而广受欢迎。然而&#xff0c;即使是经验丰富的开发者&#xff0c;在STM32F103项目开发过程中也难免会遇到各种编…...

从CLPM到RI-CLPM:Mplus中交叉滞后模型的进阶指南与选择策略

从CLPM到RI-CLPM&#xff1a;纵向数据分析的模型选择与实战解析 在心理学和行为科学的纵向研究中&#xff0c;交叉滞后模型&#xff08;CLPM&#xff09;长期以来是分析变量间相互影响关系的标准工具。然而&#xff0c;随着研究方法论的进步&#xff0c;研究者们逐渐认识到传统…...

Linux内核构建系统:Makefile、Kconfig与.config解析

1. Linux内核构建系统核心组件解析1.1 内核构建系统概述Linux内核作为复杂的开源项目&#xff0c;其构建系统由三个关键组件构成&#xff1a;Makefile、Kconfig和.config文件。这三个组件协同工作&#xff0c;构成了内核模块化构建的基础架构。1.1.1 组件类比关系Kconfig&#…...

利用OFA-Image-Caption自动生成Latex论文图表标题与描述

利用OFA-Image-Caption自动生成Latex论文图表标题与描述 写论文最烦人的步骤是什么&#xff1f;对我而言&#xff0c;除了反复修改格式&#xff0c;就是给那一大堆图表想标题和写描述了。一张图&#xff0c;你得想个既准确又简洁的标题&#xff0c;还得在正文里引用它&#xf…...