Go 语言字符串及 strings 和 strconv 包
在 Go 语言编程中,字符串是最基本、最常用的数据类型之一。无论是处理用户输入、读取文件内容,还是生成输出,字符串操作无处不在。为了方便开发者对字符串进行各种操作,Go 语言提供了强大的
strings
包和strconv
包。strings
包包含了一系列函数,用于处理和操作字符串,如查找、替换、分割、拼接等。strconv
包则专注于字符串与其他基本数据类型之间的转换,使得数据处理更加简洁高效。在这篇文章中,我们将深入探讨 Go 语言中的字符串处理方法,并详细介绍strings
包和strconv
包的主要功能和用法,帮助您更好地掌握字符串操作技巧,提高编程效率。
文章目录
- 1、Go 语言中的字符串
- 1.1、GO 语言
- 1.2、字符串字面值
- 1.3、字符串比较和操作
- 1.4、字符串拼接
- 1.5、字符串的其他操作
- 1.6、示例:统计字节和字符
- 2、strings 和 strconv 包
- 2.1、strings 包
- 2.1.1、前缀和后缀
- 2.1.2、字符串包含关系
- 2.1.3、判断子字符串或字符在父字符串中出现的位置(索引)
- 2.1.4、字符串替换
- 2.1.5、统计字符串出现次数
- 2.1.6、重复字符串
- 2.1.7、修改字符串大小写
- 2.1.8、修剪字符串
- 2.1.9、分割字符串
- 2.1.10、拼接 slice 到字符串
- 2.1.11、从字符串中读取内容
- 2.2、strconv 包
- 2.2.1、将其他类型转换为字符串
- 2.2.2、将字符串转换为其他类型
1、Go 语言中的字符串
1.1、GO 语言
在 Go 语言中,字符串是 UTF-8 编码字符的序列。对于 ASCII 字符,每个字符占用 1 个字节,而其他字符根据需要占用 2 至 4 个字节。UTF-8 是一种广泛使用的编码格式,许多标准文本文件(如 XML 和 JSON)都采用这种编码。由于 UTF-8 编码的可变长度特性,Go 语言中的字符串也可能占用 1 到 4 个字节,这与 C++、Java 或 Python 不同(例如,Java 始终使用 2 个字节)。这种设计不仅减少了内存和硬盘空间的占用,还免去了对 UTF-8 文本进行编码和解码的繁琐操作。
字符串在 Go 中是一种值类型,且值不可变。这意味着一旦创建了字符串,就不能修改其内容。更深入地讲,字符串是字节的定长数组。
1.2、字符串字面值
Go 支持两种形式的字符串字面值:
解释字符串(Interpreted Strings):
- 使用双引号括起来。
- 转义字符会被替换,例如:
\n
表示换行符,\t
表示制表符,\u
或\U
表示 Unicode 字符,\\
表示反斜杠本身。
示例:
var str = "Hello, World!\n"
非解释字符串(Raw Strings):
- 使用反引号括起来。
- 支持多行字符串,转义字符不会被替换,所有内容都会原样输出。
示例:
var rawStr = `This is a raw string \n`
在 Go 中,字符串是通过长度来限定的,而不是像 C/C++ 那样通过特殊字符 \0
结束。string
类型的零值是长度为零的字符串,即空字符串 ""
。
1.3、字符串比较和操作
字符串可以通过常见的比较运算符(==
、!=
、<
、<=
、>=
、>
)按字节在内存中进行比较。可以使用 len()
函数获取字符串的字节长度:
len("hello") // 5
字符串的内容(字节)可以通过索引访问,索引从 0 开始:
var str = "hello"
str[0] // 'h'
str[len(str)-1] // 'o'
需要注意的是,这种索引方式只对纯 ASCII 字符串有效。对于 Unicode 字符,需要使用 unicode/utf8
包提供的方法。
1.4、字符串拼接
字符串可以使用 +
运算符拼接:
var s1 = "hello"
var s2 = "world"
var s = s1 + " " + s2 // "hello world"
也可以使用 +=
运算符进行拼接:
var s = "hello"
s += ", "
s += "world!" // "hello, world!"
在循环中使用 +
进行字符串拼接并不是最高效的方法。更好的方法是使用 strings.Join()
函数,或者使用 bytes.Buffer
进行高效的字符串拼接。
1.5、字符串的其他操作
在 Go 语言中,可以将字符串视为字节(byte
)的切片(slice
),从而实现标准索引操作。使用 for
循环可以根据索引返回字符串中的字节。而使用 for-range
循环可以对 Unicode 字符串进行迭代操作。
此外,Go 语言提供了丰富的字符串操作函数和方法,可以在标准库的 strings
和 unicode/utf8
包中找到。例如,可以使用 fmt.Sprint(x)
来格式化生成并返回字符串。
1.6、示例:统计字节和字符
创建一个程序用于统计字符串中的字节和字符数量。例如,分析字符串 "asSASA ddd dsjkdsjs dk"
和 "asSASA ddd dsjkdsjsこん dk"
,并解释两者不同的原因(提示:使用 unicode/utf8
包)。
示例代码:
package mainimport ("fmt""unicode/utf8"
)func main() {str1 := "asSASA ddd dsjkdsjs dk"str2 := "asSASA ddd dsjkdsjsこん dk"fmt.Printf("String: %s\n", str1)fmt.Printf("Bytes: %d, Runes: %d\n", len(str1), utf8.RuneCountInString(str1))fmt.Printf("String: %s\n", str2)fmt.Printf("Bytes: %d, Runes: %d\n", len(str2), utf8.RuneCountInString(str2))
}
该程序统计并输出字符串的字节数和字符(rune)数,从而展示 UTF-8 编码在处理不同字符时的差异。
2、strings 和 strconv 包
在 Go 语言中,字符串作为一种基本数据结构,有许多预定义的处理函数。strings
包用于对字符串进行主要操作,而 strconv
包用于字符串与其他类型之间的转换。
2.1、strings 包
strings
包提供了丰富的字符串操作函数,以下是一些常用操作:
2.1.1、前缀和后缀
strings.HasPrefix(s, prefix string) bool
:判断字符串s
是否以prefix
开头。strings.HasSuffix(s, suffix string) bool
:判断字符串s
是否以suffix
结尾。
示例:
package mainimport ("fmt""strings"
)func main() {str := "This is an example of a string"fmt.Printf("T/F? Does the string \"%s\" have prefix %s? ", str, "Th")fmt.Printf("%t\n", strings.HasPrefix(str, "Th"))
}
输出:
T/F? Does the string "This is an example of a string" have prefix Th? true
2.1.2、字符串包含关系
strings.Contains(s, substr string) bool
:判断字符串s
是否包含子字符串substr
。
2.1.3、判断子字符串或字符在父字符串中出现的位置(索引)
strings.Index(s, str string) int
:返回子字符串str
在字符串s
中的第一个出现位置的索引,-1 表示不包含。strings.LastIndex(s, str string) int
:返回子字符串str
在字符串s
中最后一次出现位置的索引,-1 表示不包含。strings.IndexRune(s string, r rune) int
:返回字符r
在字符串s
中的索引。
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hi, I'm Marc, Hi."fmt.Printf("The position of \"Marc\" is: %d\n", strings.Index(str, "Marc"))fmt.Printf("The position of the first instance of \"Hi\" is: %d\n", strings.Index(str, "Hi"))fmt.Printf("The position of the last instance of \"Hi\" is: %d\n", strings.LastIndex(str, "Hi"))fmt.Printf("The position of \"Burger\" is: %d\n", strings.Index(str, "Burger"))
}
输出:
The position of "Marc" is: 8
The position of the first instance of "Hi" is: 0
The position of the last instance of "Hi" is: 14
The position of "Burger" is: -1
2.1.4、字符串替换
strings.Replace(str, old, new string, n int) string
:将字符串str
中的前n
个字符串old
替换为字符串new
,并返回一个新的字符串。如果n = -1
,则替换所有字符串old
。
2.1.5、统计字符串出现次数
strings.Count(s, str string) int
:计算字符串str
在字符串s
中出现的非重叠次数。
示例:
package mainimport ("fmt""strings"
)func main() {str := "Hello, how is it going, Hugo?"manyG := "gggggggggg"fmt.Printf("Number of H's in %s is: %d\n", str, strings.Count(str, "H"))fmt.Printf("Number of double g's in %s is: %d\n", manyG, strings.Count(manyG, "gg"))
}
输出:
Number of H's in Hello, how is it going, Hugo? is: 2
Number of double g’s in gggggggggg is: 5
2.1.6、重复字符串
strings.Repeat(s, count int) string
:返回一个新的字符串,该字符串由count
次重复字符串s
组成。
示例:
package mainimport ("fmt""strings"
)func main() {origS := "Hi there! "newS := strings.Repeat(origS, 3)fmt.Printf("The new repeated string is: %s\n", newS)
}
输出:
The new repeated string is: Hi there! Hi there! Hi there!
2.1.7、修改字符串大小写
strings.ToLower(s) string
:将字符串s
中的所有 Unicode 字符转换为小写。strings.ToUpper(s) string
:将字符串s
中的所有 Unicode 字符转换为大写。
示例:
package mainimport ("fmt""strings"
)func main() {orig := "Hey, how are you George?"fmt.Printf("The original string is: %s\n", orig)fmt.Printf("The lowercase string is: %s\n", strings.ToLower(orig))fmt.Printf("The uppercase string is: %s\n", strings.ToUpper(orig))
}
输出:
The original string is: Hey, how are you George?
The lowercase string is: hey, how are you george?
The uppercase string is: HEY, HOW ARE YOU GEORGE?
2.1.8、修剪字符串
strings.TrimSpace(s)
:剔除字符串开头和结尾的空白符号。strings.Trim(s, cutset)
:剔除字符串开头和结尾的指定字符cutset
。strings.TrimLeft(s, cutset)
:剔除字符串开头的指定字符cutset
。strings.TrimRight(s, cutset)
:剔除字符串结尾的指定字符cutset
。
2.1.9、分割字符串
strings.Fields(s)
:根据空白符分割字符串,返回一个字符串切片。strings.Split(s, sep)
:根据指定的分隔符sep
分割字符串,返回一个字符串切片。
示例:
package mainimport ("fmt""strings"
)func main() {str := "The quick brown fox jumps over the lazy dog"sl := strings.Fields(str)fmt.Printf("Splitted in slice: %v\n", sl)for _, val := range sl {fmt.Printf("%s - ", val)}fmt.Println()str2 := "GO1|The ABC of Go|25"sl2 := strings.Split(str2, "|")fmt.Printf("Splitted in slice: %v\n", sl2)for _, val := range sl2 {fmt.Printf("%s - ", val)}fmt.Println()str3 := strings.Join(sl2, ";")fmt.Printf("sl2 joined by ;: %s\n", str3)
}
输出:
Splitted in slice: [The quick brown fox jumps over the lazy dog]
The - quick - brown - fox - jumps - over - the - lazy - dog -
Splitted in slice: [GO1 The ABC of Go 25]
GO1 - The ABC of Go - 25 -
sl2 joined by ;: GO1;The ABC of Go;25
2.1.10、拼接 slice 到字符串
strings.Join(sl []string, sep string) string
:将元素类型为string
的 slice 使用分割符sep
拼接成一个字符串。
2.1.11、从字符串中读取内容
strings.NewReader(str)
:生成一个 Reader 并读取字符串中的内容,然后返回指向该 Reader 的指针。
示例:
package mainimport ("fmt""strings"
)func main() {str := "The quick brown fox jumps over the lazy dog"sl := strings.Fields(str)fmt.Printf("Splitted in slice: %v\n", sl)for _, val := range sl {fmt.Printf("%s - ", val)}fmt.Println()str2 := "GO1|The ABC of Go|25"sl2 := strings.Split(str2, "|")fmt.Printf("Splitted in slice: %v\n", sl2)for _, val := range sl2 {fmt.Printf("%s - ", val)}fmt.Println()str3 := strings.Join(sl2,";")fmt.Printf("sl2 joined by ;: %s\n", str3)
}
输出:
Splitted in slice: [The quick brown fox jumps over the lazy dog]
The - quick - brown - fox - jumps - over - the - lazy - dog -
Splitted in slice: [GO1 The ABC of Go 25]
GO1 - The ABC of Go - 25 -
sl2 joined by ;: GO1;The ABC of Go;25
更多字符串操作的文档请参阅官方文档。
2.2、strconv 包
strconv
包用于字符串与其他基本数据类型之间的转换。
2.2.1、将其他类型转换为字符串
strconv.Itoa(i int) string
:将整数转换为字符串。strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string
:将浮点数转换为字符串,fmt
表示格式,prec
表示精度,bitSize
用于区分float32
和float64
。
示例:
package mainimport ("fmt""strconv"
)func main() {var i int =123var f float64 = 3.14159s1 := strconv.Itoa(i)s2 := strconv.FormatFloat(f, 'f', -1, 64)fmt.Printf("Integer to string: %s\n", s1)fmt.Printf("Float to string: %s\n", s2)
}
输出:
Integer to string: 123
Float to string: 3.14159
2.2.2、将字符串转换为其他类型
strconv.Atoi(s string) (int, error)
:将字符串转换为整数。strconv.ParseFloat(s string, bitSize int) (float64, error)
:将字符串转换为浮点数。
示例:
package mainimport ("fmt""strconv"
)func main() {var str string = "666"var anInt intvar newStr stringanInt, _ = strconv.Atoi(str)fmt.Printf("The integer is: %d\n", anInt)anInt += 5newStr = strconv.Itoa(anInt)fmt.Printf("The new string is: %s\n", newStr)
}
输出:
The integer is: 666
The new string is: 671
strconv
包中还包含了一些辅助变量,如 strconv.IntSize
,用于获取当前平台下 int
类型的大小(位数)。
通过 strings
和 strconv
包的强大功能,Go 语言提供了丰富的字符串处理和转换工具,使得开发者能够高效地处理和转换字符串数据。
相关文章:
Go 语言字符串及 strings 和 strconv 包
在 Go 语言编程中,字符串是最基本、最常用的数据类型之一。无论是处理用户输入、读取文件内容,还是生成输出,字符串操作无处不在。为了方便开发者对字符串进行各种操作,Go 语言提供了强大的 strings 包和 strconv 包。strings 包包…...
政府窗口服务第三方评估报告如何写
撰写政府窗口服务第三方评估报告需要结构清晰、内容详实,并包含对评估过程和结果的详细描述以及改进建议。以下是第三方评估机构民安智库(第三方社会评估调研公司)给出的一个政府窗口服务第三方评估报告简单的示例: 一、封面 报…...

若依前后端分离Spring Security新增手机号登录
备忘贴 转自:【若依RuoYi短信验证码登录】汇总_数据库_z_xiao_qiang-RuoYi 若依 配置Security: 按照Security的流程图可知,实现多种方式登录,只需要重写三个主要的组件,第一个用户认证处理过滤器,第二个用户认证tok…...
Oracle操作扩可变字符长度交易影响分析-较小
使用AI帮助学习知识 以下知识来至AI oracle 一张大表,对可变字符串长度从10扩到20位,oracle底层存储是否会发生变化,先锁表,更新表字典信息,然后会不会重新整理表,在有交易的情况下导致大量交易失效&#…...

全栈工程师需要具备哪些技能?
概论: 全栈工程师是一位能够从头到尾构建 Web 应用程序的工程师,能独立完成产品。技术包括前端部分、后端部分和应用程序所在的基础架构。他们在整个技术栈中工作,并了解其中的每个部分。从需求分析开始,到概要设计,详…...

用java实现客服聊天+网络爬虫下载音乐(java网络编程,io,多线程)
一 灵感: 在2022年的暑假,也就是我即将迈进高三的那个暑假,我并没有察觉自己应该要学习了,还是和过往的暑假一样玩着王者荣耀,凌晨2点睡觉,中午12点起床。我依稀记得这种状态一直持续到8月19。然而离开学还…...

基于springboot+vue的医院信息管理系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

乡村振兴与农业科技创新:加大农业科技研发投入,推动农业科技创新,促进农业现代化和美丽乡村建设
一、引言 在当代中国,乡村振兴已成为国家发展的重要战略之一。作为国民经济的基础,农业的发展直接关系到国家的稳定和人民的福祉。随着科技的不断进步,农业科技创新在推动农业现代化和美丽乡村建设中发挥着越来越重要的作用。本文旨在探讨如…...
Java 雪花算法:分布式唯一ID生成的魔法秘籍
欢迎来到本次博客的旅程,今天我们要揭开一个神秘算法的面纱,它就是在分布式系统中广受欢迎的——雪花算法(Snowflake)。这个算法不是用来预测雪花的形状,而是用来生成唯一的ID,保证在分布式系统中ÿ…...
mybatis配置环境流程
mybatis配置环境流程 为啥要用mybatis:通过Mybatis实现快速访问后端pgsql、mysql等数据库。 1.修改pom.xml,添加mybatis相关依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-s…...

UE5增强输入系统入门
UE4直接在项目设置里设置的轴映射和操作映射在UE5中被标记为废弃,改为使用增强输入系统。 这两天学习了下蓝图和c中增强输入系统的使用,在这里分享一下。 学习使用的模板是第三人称模板(蓝图/c),代码蓝图都参考的模板。 增强输入系统 UE5…...
Python 语法好乱:深度解析与应对策略
Python 语法好乱:深度解析与应对策略 Python,作为一门简洁明了的编程语言,广受编程初学者的喜爱。然而,随着学习的深入,许多学习者会发现Python的语法似乎并不像初看起来那么简单,甚至有时会感到“好乱”。…...
移动端框架:加速移动应用开发与提升跨平台兼容性
在当今快速发展的移动应用领域,开发者们面临着如何快速构建、维护并发布跨平台应用的挑战。为了应对这一挑战,移动端框架应运而生,它们不仅加速了移动应用的开发流程,还提升了应用的跨平台兼容性,并确保了应用性能与原…...
Linux systemctl:掌握软件启动和关闭的利器
Linux systemctl:掌握软件启动和关闭的利器 在 Linux 操作系统中,systemctl 是一个强大的工具,用于管理系统服务的启动、停止和状态监控。本篇博客将深入介绍 systemctl 的使用方法,帮助你更好地掌握软件的启动和关闭。 1. syst…...

Jmeter干货分享:当你的Log viewer不显示日志时,可能是引入的Jar包冲突导致
问题描述 近期使用Jmeter时发现了一个非常奇怪的问题,就是Jmeter是可以正常使用运行脚本,但是在Log viewer中确没有任何日志,如下图: 问题排查过程 真是百思不得其解啊,在网上各种获取资料,大多数都是说跟…...

网络编程TCP
White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🙉 内容推荐:Java网络编程(下)🙉 🐹今日诗词: 壮士当唱大风哥, 宵小之徒能几何?🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微…...
C++中的迭代器
目录 摘要 迭代器类别 1. 输入迭代器(Input Iterator) 2. 输出迭代器(Output Iterator) 3. 前向迭代器(Forward Iterator) 4. 双向迭代器(Bidirectional Iterator) 5. 随机访…...

8.1 Go 包的概念与使用
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

第一篇【传奇开心果系列】AI工业应用经典算法和Python示例:基于AI的智能制造技术经典算法与Python实践
传奇开心果博文系列 系列博文目录AI工业应用经典算法和Python示例系列 博文目录前言一、AI在智能制造方面的应用场景介绍二、基于AI的智能制造技术经典算法介绍三、支持向量机机器学习算法Python示例代码四、随机森林机器学习算法Python示例代码五、深度学习算法Python示例代码…...

Mathtype插入编号的高级格式会重置之前的简单格式的问题
文章标题没说人话,大致意思是: 先以简单格式插入几个编号 再设置高级格式的编号时,即使没有选择插入编号,在点击下图的确定键时,会连带前面的简单公式一并更新 我在网上没有找到相关的问题,即使关闭了…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...

Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)
做RAG自己打算使用esmilvus自己开发一个,安装时好像网上没有比较新的安装方法,然后找了个旧的方法对应试试: 🚀 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana,适配中文搜索…...