Golang语言如何高效拼接字符串详解

作者:frank 时间:2023-07-11 03:46:57 

01、介绍

在编程语言中,字符串是一种重要的数据结构。在 Golang 语言中,因为字符串只能被访问,不能被修改,所以,如果我们在 Golang 语言中进行字符串拼接操作,Golang 需要进行内存拷贝。

如果读者朋友们了解过 Golang 语言内存管理的相关知识,就会知道内存拷贝会带来性能消耗。在 Golang 语言中,提供了多种字符串拼接的方式,为了降低我们编写的程序性能损耗,本文我们介绍一下每种字符串拼接方式的特点,从而学会根据不同场景选择性能最好的字符串拼接方式。

02、操作符 +

使用操作符 + 拼接字符串,是最简单的一种字符串拼接方式,它的特点是可读性强,但是性能一般,因为每次拼接,都涉及内存拷贝,需要分配一块新内存,并且该方式也仅适用于字符串类型的变量。所以,该方式适用于少量字符串类型的变量进行字符串拼接的场景。

示例代码:


str := "a" + "b" + "c"

03、strings.Join 方法

标准库 strings 中的 Join 方法,该方式只能用于拼接字符串类型的切片,将字符串类型的切片中的每个元素拼接为一个字符串,适用于拼接字符串类型切片中的元素的场景。

示例代码:


s := []string{"a", "b", "c"}
str := strings.Join(s, ", ")

04、fmt.Sprint 方法

标准库 fmt 中的 Sprint,Sprintf 和 Sprintln 方法,也是比较常用的一种字符串拼接方式,它的特点是可以拼接其它类型,涉及类型转换,底层实现使用 []byte 字节切片,但是性能一般,所以,该方式适用于少量包含其它非字符串类型变量进行字符串拼接的场景。

示例代码:


str := fmt.Sprint("a", 1, "b\r\n")
str1 := fmt.Sprintf("name:%s,age=%d.\r\n", "lucy", 17)
str2 := fmt.Sprintln("a", 1, "b")

05、bytes.Buffer 类型

标准库 bytes 中的 Buffer 类型,该类型中 WriteString 方法和 String 方法配合使用,也可以实现字符串拼接,它的特点是可以拼接字符串、字符和 Unicode,底层实现使用 []byte,但是涉及 string 和 []byte 之间的转换,性能一般,因为 WriteString 方法使用的 buffer 太长,会导致 panic,所以,该方式适用于少量字符变量和字符串变量进行字符串拼接的场景。

示例代码:


var b bytes.Buffer
b.WriteString("My ")
b.WriteString("name ")
b.WriteString("is ")
b.WriteString("lucy.")
str := b.String()

06、strings.Builder 类型

标准库 strings 中的 Builder 类型,该类型中 WriteString 方法和 String 方法配合使用,也可以实现字符串拼接,使用方式和 bytes.Buffer 相同,可以拼接字符串、字符和 Unicode,也会涉及 string 和 []byte 之间的转换,但是,它使用 unsafe.Pointer 优化了 string 和 []byte 之间的转换,所以,在大量字符串拼接的场景,推荐使用该种方式。

示例代码:


var b bytes.Builer
b.WriteString("My ")
b.WriteString("name ")
b.WriteString("is ")
b.WriteString("lucy.")
str := b.String()

07、总结

本文我们介绍了 Golang 语言中的 5 种字符串拼接方式,相信读者朋友们已经了解每种方式适合使用的场景。最后,我再做个简要总结。

  • 在少量仅有字符串类型的变量拼接字符串时,并且对性能要求不高的场景,推荐使用操作符 + 的方式;

  • 在字符串类型切片中的元素拼接字符串时,推荐使用 strings.Join 方式;

  • 在少量多种类型变量拼接字符串时,推荐使用 fmt.Sprint 的方式;

  • 在少量字符串、字符和 Unicode 拼接字符串时,并且对性能有一定要求的场景,推荐使用 buyes.Buffer 的方式;

  • 在大量字符串、字符和 Unicode 拼接字符串时。并且对性能有一定要求的场景,推荐使用 strings.Builder 的方式。

来源:https://mp.weixin.qq.com/s/zwVVeLdclj8qPaj189ygNg

标签:golang,拼接,字符串
0
投稿

猜你喜欢

  • 利用 Monkey 命令操作屏幕快速滑动

    2021-03-06 11:37:50
  • Python中类型关系和继承关系实例详解

    2023-10-08 06:15:06
  • python中copy()与deepcopy()的区别小结

    2022-02-22 19:39:14
  • Python读取hdf文件并转化为tiff格式输出

    2021-02-22 18:59:56
  • Python利用matplotlib绘制约数个数统计图示例

    2023-11-12 16:00:43
  • javascript增加干扰数据实现简单加密效果

    2011-02-24 11:07:00
  • 分享几个字体设计

    2007-10-10 13:53:00
  • 实例讲解SQL Server加密功能

    2024-01-24 04:05:15
  • NopCommerce架构分析之(八)多语言支持

    2024-05-13 09:15:53
  • Python实现获取前100组勾股数的方法示例

    2022-07-14 08:54:23
  • Vue中使用webpack别名的方法实例详解

    2024-05-11 09:13:41
  • 基于Python闭包及其作用域详解

    2023-11-07 07:22:02
  • Python生成器定义与简单用法实例分析

    2021-03-12 21:45:59
  • VSCODE配置Markdown及Markdown基础语法详解

    2021-10-02 10:21:20
  • OraclePL/SQL单行函数和组函数详解

    2010-07-28 13:02:00
  • Design IT. (3),看不懂数据

    2009-02-11 10:56:00
  • python随机生成大小写字母数字混合密码(仅20行代码)

    2021-04-03 23:28:47
  • Python3监控疫情的完整代码

    2023-09-24 09:53:19
  • SQL2000 事务回滚问题探讨

    2024-01-26 19:58:37
  • python中的二维列表实例详解

    2022-03-26 05:17:11
  • asp之家 网络编程 m.aspxhome.com