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

弘君资本:存储芯片概念强势,西测测试三连板,佰维存储涨超10%
存储芯片概念3日盘中强势拉升,截至发稿,西测测验、万润科技涨停,佰维存储涨超10%,香农芯创涨近7%,航天智装、普冉股份等涨超5%。值得注意的是,西测测验已连续3个交易日涨停。 职业方面,当时干流…...

【机器学习】逻辑回归:原理、应用与实践
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 逻辑回归:原理、应用与实践引言1. 逻辑回归基础1.1 基本概念1.2 Sig…...

C++:list模拟实现
hello,各位小伙伴,本篇文章跟大家一起学习《C:list模拟实现》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!…...

植物大战僵尸杂交版全平台 PC MAC 安卓手机下载安装详细图文教程
最近植物大战僵尸杂交版非常的火,好多小伙伴都想玩一玩,但作者只分享了 win 版,像手机还有MAC电脑都没有办法安装,身为 MAC 党当然不能放弃,经过一番折腾,也是成功在所有平台包括手机和MAC电脑都成功安装上…...

发送Http请求的两种方式
说明:在项目中,我们有时会需要调用第三方接口,获取调用结果,来实现自己的业务逻辑。调用第三方接口,通常是双方确定好,由对方开放一个接口,需要我们根据他们提供的接口文档,组装Http…...

【算法训练记录——Day23】
Day23——二叉树Ⅸ 669.修剪二叉搜索树108.将有序数组转换为二叉搜索树538.把二叉搜索树转换为累加树 今日内容: ● 669.修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇 669.修剪二叉搜索树 思路:主要是…...

【wiki知识库】04.SpringBoot后端实现电子书的增删改查以及前端界面的展示
📝个人主页:哈__ 期待您的关注 目录 一、🔥今日内容 二、🌏前端页面的改造 2.1新增电子书管理页面 2.2新增路由规则 2.3修改the-header代码 三、🚗SpringBoot后端Ebook模块改造 3.1增加电子书增/改接口 3.1.…...

NTLM Relay Gat:自动化NTLM中继安全检测工具
关于NTLM Relay Gat NTLM Relay Gat是一款功能强大的NTLM中继威胁检测工具,该工具旨在利用Impacket工具套件中的ntlmrelayx.py脚本在目标环境中实现NTLM中继攻击风险检测,以帮助研究人员确定目标环境是否能够抵御NTLM中继攻击。 功能介绍 1、多线程支持…...

摸鱼大数据——Hive函数14
14、开窗(开列)函数 官网链接:Window Functions - Apache AsterixDB - Apache Software Foundation 14.1 基础使用 开窗函数格式: 开窗函数 over(partition by 分组字段名 [order by 排序字段名 asc|desc] [rows between 开窗开始 and 开窗结束]) partition b…...

elasticsearch的常规操作--增删改查和批量处理
1、_cat 查询 GET /_cat/nodes: 查看所有节点 GET /_cat/health: 查看es 健康状况 GET /_cat/master: 查看主节点 GET /_cat/indices:查看所有索引show databases; 2、索引一个文档(保存) 保存一个数据&…...