您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

Go 语言字符串使用方式与技巧

时间:2023-12-10 13:44:32  来源:微信公众号  作者:Golang语言开发栈

01 

介绍

关于 Go 语言字符串的使用,我们需要了解标准库 strconv 和标准库 strings 的使用方式,它们分别用于字符串类型转换和字符串操作。

本文我们重点介绍 Go 语言字符串使用方式与技巧。

02 

字符串类型转换

Go 语言是强类型语言,在使用 Go 语言时,通常会遇到需要将字符串与其它类型相互转换的场景。

此时,我们可以使用标准库 strconv

字符串 to 布尔

示例代码:

func mAIn() {
 v := "true"
 if s, err := strconv.ParseBool(v); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
}

输出结果:

bool, true

阅读上面这段代码,我们使用 func ParseBool(str string) (bool, error) 将字符串转换为布尔。需要注意的是,该函数接收参数的值是有限制的,除了 1、t、T、TRUE、true、True、0、f、F、FALSE、false、False 之外,其它任何值都会返回 error。

字符串 to 浮点型

示例代码:

func main() {
 v := "3.1415926535"
 if s, err := strconv.ParseFloat(v, 32); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
 if s, err := strconv.ParseFloat(v, 64); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
 if s, err := strconv.ParseFloat("NaN", 32); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
 // ParseFloat is case insensitive
 if s, err := strconv.ParseFloat("nan", 32); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
 if s, err := strconv.ParseFloat("inf", 32); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
 if s, err := strconv.ParseFloat("+Inf", 32); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
 if s, err := strconv.ParseFloat("-Inf", 32); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
 if s, err := strconv.ParseFloat("-0", 32); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
 if s, err := strconv.ParseFloat("+0", 32); err == nil {
  fmt.Printf("%T, %vn", s, s)
 }
}

输出结果:

float64, 3.1415927410125732
float64, 3.1415926535
float64, NaN
float64, NaN
float64, +Inf
float64, +Inf
float64, -Inf
float64, -0
float64, 0

阅读上面这段代码,我们使用 func ParseFloat(s string, bitSize int) (float64, error) 将字符串转换为 64 位浮点数。需要注意的是,该函数接收参数可以识别值为 NaNInf(有符号 +Inf 或 -Inf),并且忽略它们的大小写。

字符串 to 整型

示例代码:

func main() {
 v32 := "-354634382"
 if s, err := strconv.ParseInt(v32, 10, 32); err == nil {
  fmt.Printf("s:%T, %vn", s, s)
 }
 if s1, err := strconv.ParseInt(v32, 16, 32); err == nil {
  fmt.Printf("s1:%T, %vn", s1, s1)
 }

 v64 := "-3546343826724305832"
 if s2, err := strconv.ParseInt(v64, 10, 64); err == nil {
  fmt.Printf("s2:%T, %vn", s2, s2)
 }
 if s3, err := strconv.ParseInt(v64, 16, 64); err == nil {
  fmt.Printf("s3:%T, %vn", s3, s3)
 }
}

输出结果:

s:int64, -354634382
s2:int64, -3546343826724305832

阅读上面这段代码,我们使用 func ParseInt(s string, base int, bitSize int) (i int64, err error) 将字符串转换为整型。

需要注意的是,该函数的第一个入参为字符串类型的数值,可以 "+" 或 "-" 符号开头;

第二个参数指定进制,它的值如果是 0,进制则以第一个参数符号后的前缀决定,例如:"0b" 为 2,"0" 或 "0o" 为 8,"0x" 为 16,否则为 10;

第三个参数指定返回结果必须符合整数类型的取值范围,它的值为 0、8、16、32 和 64,分别代表 intint8int16int32 和 int64

细心的读者朋友们可能已经发现,示例代码中,第 2 和 第 4 返回错误,原因是第二个参数指定的进制与第一个参数的数值不相符,超出取值范围。

此外,函数 func ParseUint(s string, base int, bitSize int) (uint64, error) 与之类似,但是用于无符号整数。

在实际项目开发中,十进制使用的最多,所以标准库 strconv 提供了函数 func Atoi(s string) (int, error),它的功能类似 ParseInt(s, 10, 0),需要注意的是,它的返回值类型是 int(需要注意取值范围),而不是 int64

布尔 to 字符串

示例代码:

func main() {
 v := true
 s := strconv.FormatBool(v)
 fmt.Printf("%T, %vn", s, s)
}

输出结果:

string, true

阅读上面这段代码,我们使用 func FormatBool(b bool) string 将布尔转换为字符串。

浮点型 to 字符串

示例代码:

func main() {
 v := 3.1415926535

 s32 := strconv.FormatFloat(v, 'E', -1, 32)
 fmt.Printf("%T, %vn", s32, s32)

 s64 := strconv.FormatFloat(v, 'E', -1, 64)
 fmt.Printf("%T, %vn", s64, s64)

 fmt64 := strconv.FormatFloat(v, 'g', -1, 64)
 fmt.Printf("%T, %vn", fmt64, fmt64)
}

输出结果:

string, 3.1415927E+00
string, 3.1415926535E+00
string, 3.1415926535

阅读上面这段代码,我们使用 func FormatFloat(f float64, fmt byte, prec, bitSize int) string 将浮点型转换为字符串。该函数包含 4 个参数,第一个参数是需要转换的浮点数;第二个参数是进制;第三个参数是精度,第四个参数是转换后值的取值范围。

其中,第二个参数 b 代表二进制指数;e 或 E 代表十进制指数;f 代表无进制指数;g 或 G 代表指数大时 为 e,反之为 fx 或 X 代表十六进制分数和二进制指数。

第三个参数,精度 prec 控制由 'e','E','f','g','G','x' 和 'X' 格式打印的位数(不包括指数)。对于 'e','E','f','x' 和 'X',它是小数点后的位数。对于 'g' 和 'G',它是有效数字的最大数目(去掉后面的零)。特殊精度 -1 使用所需的最小位数,以便 ParseFloat 精确返回 f

整型 to 字符串

示例代码:

func main() {
 v := int64(-42)

 s10 := strconv.FormatInt(v, 10)
 fmt.Printf("%T, %vn", s10, s10)

 s16 := strconv.FormatInt(v, 16)
 fmt.Printf("%T, %vn", s16, s16)
}

输出结果:

string, -42
string, -2a

阅读上面这段代码,我们使用 func FormatInt(i int64, base int) string 将整型转换为字符串。需要注意的是,第二个参数的取值范围 2 <= base <= 36

此外,函数 func FormatUint(i uint64, base int) string 与之功能类型,区别是仅用于转换无类型整数。

在实际项目开发中,十进制使用的最多,所以标准库 strconv 提供了函数 func Itoa(i int) string,它的功能类似 FormatInt(int64(i), 10),需要注意的是,该函数入参的类型是 int

03 

字符串操作

关于字符串操作,标准库 strings 提供了相关函数,我们介绍几个常用的函数。

字符串中是否包含指定字符串

示例代码:

func main() {
 fmt.Println(strings.Contains("seafood", "foo"))
 fmt.Println(strings.Contains("seafood", "bar"))
 fmt.Println(strings.Contains("seafood", ""))
 fmt.Println(strings.Contains("", ""))
}

输出结果:

true
false
true
true

阅读上面这段代码,我们使用 func Contains(s, substr string) bool 在字符串 substr 中查找 s,存在则返回 true,反之返回 false

字符串中是否包含指定字符串中任意字符

示例代码:

func main() {
 fmt.Println(strings.ContainsAny("team", "i"))
 fmt.Println(strings.ContainsAny("fail", "ui"))
 fmt.Println(strings.ContainsAny("ure", "ui"))
 fmt.Println(strings.ContainsAny("failure", "ui"))
 fmt.Println(strings.ContainsAny("foo", ""))
 fmt.Println(strings.ContainsAny("", ""))
}

输出结果:

false
true
true
true
false
false

阅读上面这段代码,我们使用 func ContainsAny(s, chars string) bool 在字符串 s 中查找是否包含字符串 chars 中任意字符,存在则返回 true,反之返回 false

删除字符串中指定字符

示例代码:

func main() {
 fmt.Print(strings.Trim("¡¡¡Hello, Gophers!!!", "!¡"))
}

输出结果:

Hello, Gophers

阅读上面这段代码,我们使用 func Trim(s, cutset string) string 删除字符串 s 中的字符 cutset

字符串转换为大写

示例代码:

func main() {
 fmt.Println(strings.ToUpper("Gopher"))
}

输出结果:

GOPHER

阅读上面这段代码,我们使用 func ToUpper(s string) string 将字符串中的字符全部转换为大写。

字符串以指定字符拆分为字符串切片

示例代码:

func main() {
 fmt.Printf("%qn", strings.Split("a,b,c", ","))
 fmt.Printf("%qn", strings.Split("a man a plan a canal panama", "a "))
 fmt.Printf("%qn", strings.Split(" xyz ", ""))
 fmt.Printf("%qn", strings.Split("", "Bernardo O'Higgins"))
}

输出结果:

["a" "b" "c"]
["" "man " "plan " "canal panama"]
[" " "x" "y" "z" " "]
[""]

阅读上面这段代码,我们使用 func Split(s, sep string) []string 将字符串 s 以字符串 sep 为分隔符,拆分为字符串切片。

字符串切片拼接为字符串

示例代码:

func main() {
 s := []string{"foo", "bar", "baz"}
 fmt.Println(strings.Join(s, ", "))
}

输出结果:

foo, bar, baz

阅读上面这段代码,我们使用 func Join(elems []string, sep string) string 将字符串切片中的所有元素,以 sep 为分隔符,拼接为字符串。

04 

字符串拼接

关于字符串拼接,分为编译时字符串拼接,和运行时字符串拼接。

其中,编译时字符串拼接,即使用 + 将多个字符串拼接为一个字符串,需要注意的是,在使用 + 拼接字符串时,如果存在字符串变量,则会在运行时拼接。

示例代码:

func main() {
    str := "hello" + " world"
    fmt.Println(str)
    name := "frank"
    outPut := "My name is " + name
    fmt.Println(outPut)
}

输出结果:

hello world
My name is frank

阅读上面这段代码,第一个字符串拼接是在编译时拼接,第二个字符串拼接是在运行时拼接。

需要注意的是,运行时拼接是分配一块新的内存空间,通过内存拷贝的方式将字符串拷贝到新内存空间。

如果拼接后的字符串小于 32 字节,可以使用临时缓存;如果拼接后的字符串大于 32 字节,需要在堆区分配一块内存空间,并将需要拼接的多个字符串通过内存拷贝的形式拷贝过去。

字符串与字节数组互相转换时,也需要通过内存拷贝的方式,如果字符串大于 32 字节,需要在堆区分配一块内存空间,所以在一些转换密集的场景,我们需要特别注意。

此外,除了使用操作符 + 或 += 拼接字符串之外,还有多种字符串拼接方式,例如,fmt.Sprintfbytes.Bufferstrings.Join 和 stings.Builder。这些字符串拼接方式在之前的文章 「Golang 语言怎么高效拼接字符串?」 介绍过,本文不再赘述。

05 

总结

本文我们介绍 Go 语言中字符串的使用方式,包括类型转换、字符串操作、字符串拼接。

除了使用标准库 strconv 进行字符串类型转换之外,读者朋友们也可以选择三方库,例如:Github.com/spf13/cast

建议读者朋友们阅读标准库文档,了解更多关于标准库 strconv 和 strings 的函数。



Tags:Go 语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Go 语言不支持并发读写 Map,为什么?
Go语言的map类型不支持并发读写的主要原因是并发读写会导致数据竞态(data race),这意味着多个 goroutine 可能同时访问并修改同一个 map,从而引发不确定的结果。在Go语言的设计...【详细内容】
2024-01-05  Search: Go 语言  点击:(76)  评论:(0)  加入收藏
Go 语言为什么建议多使用切片,少使用数组?
01 、介绍在 Go 语言中,数组固定长度,切片可变长度;数组和切片都是值传递,因为切片传递的是指针,所以切片也被称为“引用传递”。读者朋友们在使用 Go 语言开发项目时,或者在阅读...【详细内容】
2023-12-27  Search: Go 语言  点击:(133)  评论:(0)  加入收藏
Go 语言使用 Echo 构建高性能 Web 应用
Echo提供了一个高性能且易用的框架,用于构建Go语言编写的Web应用。它具备灵活的路由功能、方便的请求处理、强大的中间件支持和简单的JSON操作,非常适合快速开发API服务和Web...【详细内容】
2023-12-26  Search: Go 语言  点击:(134)  评论:(0)  加入收藏
Go 语言中并发的威力
发挥效率和响应能力并发是现代软件开发中的一个基本概念,它使程序能够同时执行多个任务,提高效率和响应能力。在本文中,我们将探讨并发在现代软件开发中的重要性,并深入了解 Go...【详细内容】
2023-12-21  Search: Go 语言  点击:(115)  评论:(0)  加入收藏
Go 语言字符串使用方式与技巧
01 介绍关于 Go 语言字符串的使用,我们需要了解标准库 strconv 和标准库 strings 的使用方式,它们分别用于字符串类型转换和字符串操作。本文我们重点介绍 Go 语言字符串使用...【详细内容】
2023-12-10  Search: Go 语言  点击:(159)  评论:(0)  加入收藏
Go 语言中的map和内存泄漏
Map在内存中总是会增长;它不会收缩。因此,如果map导致了一些内存问题,你可以尝试不同的选项,比如强制 Go 重新创建map或使用指针。在 Go 中使用map时,我们需要了解map增长和收缩...【详细内容】
2023-11-23  Search: Go 语言  点击:(248)  评论:(0)  加入收藏
Go 语言切片扩容规则是扩容2倍?1.25倍?到底几倍
切片,相信大家用了 Go 语言那么久这这种数据类型并不陌生,但是平日里聊到关于切片是如何扩容的,很多人可能会张口就来,切片扩容的时候,如果老切片的容量小于 1024 那么就再扩容 1...【详细内容】
2023-10-11  Search: Go 语言  点击:(218)  评论:(0)  加入收藏
Go 语言流行 ORM 框架
ORM,全称 Object-Relational Mapping,即对象-关系映射,是一种程序设计技术,用于实现面向对象编程语言里对象的表现形式与关系数据库中数据的存储之间的转换。在实际工作中,我们...【详细内容】
2023-10-05  Search: Go 语言  点击:(230)  评论:(0)  加入收藏
盘点 Go 语言的那些日志库:你用了哪个?
Go语言是一种高性能、简洁、并发友好的编程语言,广泛用于开发各种应用程序,如网络服务、微服务、云计算、区块链等。Go语言的标准库提供了一个基本的日志包(log),可以用于记录简...【详细内容】
2023-09-10  Search: Go 语言  点击:(224)  评论:(0)  加入收藏
为什么说 Go 语言字符串是不可变的?
最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就...【详细内容】
2023-05-29  Search: Go 语言  点击:(247)  评论:(0)  加入收藏
▌简易百科推荐
宝藏级Go语言开源项目——教你自己动手开发互联网搜索引擎
DIYSearchEngine 是一个能够高速采集海量互联网数据的开源搜索引擎,采用 Go 语言开发。Github 地址:https://github.com/johnlui/DIYSearchEngine运行方法首先,给自己准备一杯...【详细内容】
2024-03-12  OSC开源社区    Tags:Go语言   点击:(18)  评论:(0)  加入收藏
Go Gin框架实现优雅地重启和停止
在Web应用程序中,有时候我们需要重启或停止服务器,无论是因为更新代码还是进行例行维护。在这种情景下,我们需要保证应用程序的可用性和数据的一致性。这就需要优雅地关闭和重...【详细内容】
2024-01-30  源自开发者  微信公众号  Tags:Go   点击:(67)  评论:(0)  加入收藏
如何让Go程序以后台进程或daemon方式运行
本文探讨了如何通过Go代码实现在后台运行的程序。最近我用Go语言开发了一个WebSocket服务,我希望它能在后台运行,并在异常退出时自动重新启动。我的整体思路是将程序转为后台...【详细内容】
2024-01-26  Go语言圈  微信公众号  Tags:Go程序   点击:(60)  评论:(0)  加入收藏
深入Go底层原理,重写Redis中间件实战
Go语言以其简洁、高效和并发性能而闻名,深入了解其底层原理可以帮助我们更好地利用其优势。在本文中,我们将探讨如何深入Go底层原理,以及如何利用这些知识重新实现一个简单的Re...【详细内容】
2024-01-25  547蓝色星球    Tags:Go   点击:(66)  评论:(0)  加入收藏
Go 内存优化与垃圾收集
Go提供了自动化的内存管理机制,但在某些情况下需要更精细的微调从而避免发生OOM错误。本文将讨论Go的垃圾收集器、应用程序内存优化以及如何防止OOM(Out-Of-Memory)错误。Go...【详细内容】
2024-01-15  DeepNoMind  微信公众号  Tags:Go   点击:(61)  评论:(0)  加入收藏
Go函数指针是如何让你的程序变慢的?
导读Go 语言的常规优化手段无需赘述,相信大家也能找到大量的经典教程。但基于 Go 的函数值问题,业界还没有太多深度讨论的内容分享。本文作者根据自己对 Go 代码的使用与调优...【详细内容】
2024-01-15  腾讯云开发者  微信公众号  Tags:Go函数   点击:(85)  评论:(0)  加入收藏
Go编程中调用外部命令的几种场景
在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库...【详细内容】
2024-01-09  suntiger    Tags:Go编程   点击:(100)  评论:(0)  加入收藏
Go 语言不支持并发读写 Map,为什么?
Go语言的map类型不支持并发读写的主要原因是并发读写会导致数据竞态(data race),这意味着多个 goroutine 可能同时访问并修改同一个 map,从而引发不确定的结果。在Go语言的设计...【详细内容】
2024-01-05  Go语言圈  微信公众号  Tags:Go 语言   点击:(76)  评论:(0)  加入收藏
Go微服务入门到容器化实践
Go微服务入门到容器化实践Go 是一门高效、现代化、快速增长的编程语言,非常适合构建 Web 应用程序。而 Docker 是一种轻量级的容器化技术,能够使得您的应用程序在任何地方运行...【详细内容】
2024-01-01  大雷家吃饭    Tags:Go微服务   点击:(61)  评论:(0)  加入收藏
你是否想知道如何应对高并发?Go语言为你提供了答案!
并发编程是当前软件领域中不可忽视的一个关键概念。随着CPU等硬件的不断发展,我们都渴望让我们的程序运行速度更快、更快。而Go语言在语言层面天生支持并发,充分利用现代CPU的...【详细内容】
2023-12-29  灵墨AI探索室  微信公众号  Tags:Go语言   点击:(107)  评论:(0)  加入收藏
站内最新
站内热门
站内头条