常见的 Go 处理字符串的技巧

常见的 Go 处理字符串的技巧

1、多行字符串

str := `This is amultilinestring.`

登录后复制

注意 – 任何你在字符串中的缩进都将被保留在最终结果。

str := `This string    will have    tabs in it`

登录后复制

2. 高效的字符串连接方式

Go 允许你通过 “+” 的方式连接字符串,但这种方式在处理大量字符串连接的场景下将非常低效。使用 bytes.Buffer 连接字符串是一个更高效的方式,它会一次性将所有的内容连接起来转化成字符串。

package mainimport (    "bytes"    "fmt")func main() {    var b bytes.Buffer    for i := 0; i 

如果你提前准备好所有字符串,你也可以通过 strings.Join 的方式实现。

package mainimport (    "fmt"    "strings")func main() {    var strs []string    for i := 0; i 

3. 将整型 (或任意数据类型) 转为字符串

在大多数语言中,可轻易地将任意数据类型转型为字符串进行拼接,或用字符串插入(例如在 ruby 中这样 "ID=#{id}")。很不幸,如果你尝试在 Go 中去做这种显示而易见的操作,比如强制将整形转为字符串,你不会得到期望的结果。

i := 123s := string(i)

登录后复制

你希望 s 的输出是多少?如果你像大多数人一样猜测 "123",那你就大错特错了。相反,你会得到类似 "E" 的值。这根本不是我们想要的!

相反,您应该使用像 [strconv] (https://golang.org/pkg/strconv/) 这样的包或像 fmt.Sprintf 这样的函数。例如,下面是一个使用 strconv.Itoa 将整数转换为字符串的示例。

package mainimport (    "fmt"    "strconv")func main() {    i := 123    t := strconv.Itoa(i)    fmt.Println(t)}

登录后复制

你还可以使用 fmt.Sprintf 函数将几乎所有数据类型转换为字符串,但通常应保留在这样的实例上,如正在创建的字符串包含嵌入数据,而非在期望将单个整数转换为字符串时用。

package mainimport "fmt"func main() {    i := 123    t := fmt.Sprintf("We are currently processing ticket number %d.", i)    fmt.Println(t)}

登录后复制

Sprintf 的操作与 fmt.Printf 几乎相同,只是它没有将结果字符串输出到标准输出,而是将其作为字符串返回。

限制使用 Sprintf

如前所述,fmt.Sprintf 通常应用在创建具有嵌入值的字符串。这有几个原因,但最突出的一个原因是 fmt.Sprintf 不做任何类型检查,因此在实际运行代码之前,您不太可能发现任何错误。

Sprintf 也比你通常在 strconv 包中使用的大多数函数慢,不过如果我说实话,速度差异是如此之小,一般不值得考虑。

4. 创建随机字符串

这并不是一个真正的「快速技巧」,但我发现这是一个经常被问到的问题。

如何在 Go 中创建随机的字符串?

听上去很简单。许多语言,比如 Ruby 和 Python,都提供了一些帮助程序,使随机字符串的生成变得非常简单,所以 Go 肯定有这样一个工具,对吧?答案是错误的。

Go 选择只提供创建随机字符串的工具,而将细节留给开发人员。虽然一开始可能会有些困难,但好处是您可以完全决定如何生成字符串。 这意味着您可以指定字符集、如何播种随机生成以及任何其他详细信息。简而言之,你有更多的控制权,但代价是需要写一些额外的代码。

下面是一个使用 math/rand 包和一组字母数字字符作为字符集的快速示例。

package mainimport (    "fmt"    "math/rand"    "time")func main() {    fmt.Println(RandString(10))}var source = rand.NewSource(time.Now().UnixNano())const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"func RandString(length int) string {    b := make([]byte, length)    for i := range b {        b[i] = charset[source.Int63()%int64(len(charset))]    }    return string(b)}

登录后复制

Go 练习场总是输出相同的字符串

如果您在 Go 练习场上多次运行这段代码,您可能会注意到它总是输出相同的字符串 - aJFLa7XPH5。

这是因为 Go 练习场总是使用相同的时间,所以当我们用 rand.NewSource 方法时。在当前时间内传递的那个值总是相同的,所以我们生成的字符串总是相同的。

对于您的特定需求,可能有比这个更优的解决方案,但这是一个很好的起点。如果您正在寻找改进 / 更改代码的方法,您可能会考虑使用 crypto/rand 包来生成随机数据 — 这通常更安全,但最终可能需要更多的工作。

无论您最终使用的是什么,这个示例都应该有助于您入门。 对于大多数不涉及密码和身份验证系统等敏感数据的实际用例,它工作得足够好。 只是一定要记得你的种子随机数发生器!这可以通过 rand.Seed 函数在 math/rand 包中完成,或者创建一个源代码。在上面的例子中,我选择创建一个源代码。

5. strings 包、HasPrefix 和自定义代码

在处理字符串时,想要知道一个字符串是以一个特定的字符串开始还是以一个特定的字符串结束是非常常见的情况。例如,如果您的 API 键都以 sk_ 开头,那么您可能希望验证 API 请求中提供的所有 API 键都以这个前缀开头,否则进行数据库查找将浪费大量时间。

对于那些听起来像是非常常见的用例的函数,您最好的选择通常是直接访问 strings 包并检查一些可能对您有帮助的内容。在这种情况下,你会想要使用功能 HasPrefix(str, prefix) 和 strings.HasSuffix(str, prefix)。 你可以在下面看到他们的用法。

package mainimport (    "fmt"    "strings")func main() {    fmt.Println(strings.HasPrefix("something", "some"))    fmt.Println(strings.HasSuffix("something", "thing"))}

登录后复制

虽然 strings 包中有大量有用的公共函数,但值得注意的是,并不总是值得去寻找一个能满足您需要的包。如果你有其他语言经验正在学习 Go 语言,一个常见的错误是开发者花太多时间寻找能够提供所需功能的包,而他们自己可轻易地编码实现这功能。

使用标准库肯定有好处(如它们经过了彻底的测试并有很好的文档记录)。尽管有这些好处,但如果你发现自己花了超过几分钟的时间来寻找一个函数,那么自己编写它通常也是有益的。在这种情况下,根据需求自定义(编码),将很快完成,你将完全了解正在发生的事情,不会被奇怪的边界情况(译者注如索引越界)措手不及。您也不必担心其他人维护代码。

6. 字符串可以被转换成 byte 切片 (反之亦然)

Go 语言可以将一个字符串转换成 byte 切片 ([]byte) ,也可以将 byte 切片转换成字符串。转换的过程跟其他任意类型转换的方式一样简单。这种转换方式通常用于为一个接收 byte 切片参数的函数传递一个字符串 以及 为一个接收字符串参数的函数传递 byte 切片的场景。

下面是一个转换的例子:

package mainimport "fmt"func main() {    var s string = "this is a string"    fmt.Println(s)    var b []byte    b = []byte(s)    fmt.Println(b)    for i := range b {        fmt.Println(string(b[i]))    }    s = string(b)    fmt.Println(s)}

登录后复制

以上就是 Go 语言字符串使用过程中的一些小技巧,希望能帮到你。如果你需要更多 Go 相关的实践,可以查阅我发表的其他相关教程。

推荐教程:《Go教程》

以上就是常见的 Go 处理字符串的技巧的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2594053.html

(0)
上一篇 2025年3月6日 17:28:56
下一篇 2025年3月6日 11:00:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • grpc只支持go语言吗

    grpc不是只支持go语言。grpc是通信协议基于HTTP/2,支持多语言的RPC框架;目前提供C、Java和Go语言版本,分别是grpc、grpc-java、grpc-go;其中C版本支持C、C++、Node.js、Python、Ruby…

    2025年3月6日 编程技术
    200
  • go是一种语言吗

    go是一种语言。Go(又称Golang)是Google公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。Go是编译型语言,使用编译器来编译代码。编译器将源代码编译成二进制(或字节码)格式;在编译代码时,编译器检查错误、…

    2025年3月6日
    200
  • golang作者有哪些

    Go语言的作者有三个:1、罗伯特·格利茨默(Robert Griesemer),就职于Google,参与开发Java HotSpot虚拟机,是Google V8、Chubby和HotSpot JVM的主要贡献者。2、罗伯·派克(Rob Pi…

    2025年3月6日
    200
  • golang和什么相似

    golang和c语言相似。Go语言被描述为“C 类似语言”,或者是“21 世纪的C语言”,其语法与C相近;Go从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有C语言一直所看中的编译后机器码的运行效…

    2025年3月6日
    200
  • golang是高级语言吗

    golang是高级语言,它是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序,它为解决大型系统开发过程中的实际问题而设计,支持并发、规范统一、简单优雅,性能强大,它的主要目标是“兼具 Python 等动…

    2025年3月6日
    200
  • golang需要解释器么

    golang不需要解释器,它是一种编译型语言,意味着源代码在执行之前需要先编译成机器码,以获得更高的执行性能和更好的内存管理能力,与解释型语言相比,这种特性使得golang具有更好的性能和更高的执行效率。 本文操作环境:Windows10系…

    2025年3月6日
    200
  • EMQX与Golang-Gin集成:如何实现高效安全的MQTT认证及业务处理?

    EMQX和Golang-Gin框架集成:实现高效安全的MQTT认证与业务逻辑处理 本文阐述如何结合EMQX MQTT消息服务器和Golang-Gin框架,构建高效安全的MQTT认证和业务处理流程。我们将围绕三个核心问题展开:如何利用JWT令…

    2025年3月6日
    200
  • Golang中缓存的实现策略和常见问题解决方法。

    随着互联网技术的不断发展和应用的广泛,数据量和数据访问的频率都在指数级别地增长。这使得应用系统访问数据库、网络服务的性能成为了一个瓶颈,造成了问题的出现。于是,缓存作为一种提高应用性能的技术在应用开发中被广泛应用。golang作为一种高效的…

    编程技术 2025年3月6日
    200
  • 使用Golang开发高性能缓存服务器的技巧。

    随着互联网的快速发展,对于高性能的需求也越来越大。而在大规模互联网应用中,缓存服务器是非常重要的一环。缓存服务器可以有效地提高系统的性能,减少数据库的负担,从而提高整个应用系统的响应速度。 在众多的缓存服务器中,Golang作为一门性能出色…

    编程技术 2025年3月6日
    200
  • Golang中使用缓存提高Web应用程序调用的实践技巧。

    golang中使用缓存提高web应用程序调用的实践技巧 Golang是一门高效、简洁、并发的编程语言,越来越受到开发者的青睐。随着Web应用程序越来越复杂,数据量越来越大,程序性能可能会受到影响。为了解决这些问题,使用缓存技巧可以显著提高W…

    编程技术 2025年3月6日
    200

发表回复

登录后才能评论